こんにちは!データベースの世界へようこそ。
PostgreSQLを触っていると、必ず一度は「あれ?なんでこのクエリ、こんなに遅いの?」という壁にぶつかりますよね。データが増えてくると、さっきまで爆速だった検索が、急に重たく感じたりして。
そんな時、私たちエンジニアが真っ先に頼るのが「EXPLAIN ANALYZE」という魔法のコマンドです。
今日は、これが一体どんなものなのか、専門用語を抜きにして、皆さんと一緒に紐解いていきたいと思います。
—
料理店に例えてみよう
想像してみてください。あなたは今、大人気のレストランのオーナーです。
ある日、お客さんから「料理が出てくるのが遅い!」というクレームが入りました。
さて、どうやって原因を探しますか?
1. キッチンに駆け込んで、シェフが何をしているか直接見る。
2. どの料理に時間がかかっているか、伝票をチェックする。
「EXPLAIN ANALYZE」は、まさにこの「キッチンの様子を完全に可視化するカメラ」のようなものなんです。
普通の「EXPLAIN」は「予定表」
まず、「EXPLAIN」だけを付けると、データベースは「こうやって料理を作る予定だよ」という計画書を見せてくれます。いわば、「レシピ」ですね。でも、これだけだと「予定ではすぐできるはずなのに、なんで実際は遅いの?」という疑問が残りませんか?
「EXPLAIN ANALYZE」は「実況付きの録画」
そこで「ANALYZE」を付け加えます。すると、データベースは「実際に作ってみた結果」を教えてくれます。
- 「玉ねぎを切るのに1分かかりました」
- 「冷蔵庫から食材を出すのに3回往復しました」
- 「合計で5分かかりました」
というふうに、「予定」と「現実」のギャップを赤裸々に報告してくれるんです。「あ、ここで無駄な往復を繰り返してたんだ!」と気づくきっかけになるわけですね。
—
実際にどう使うの?
使い方はとってもシンプル。いつも使っている検索コマンド(SELECTなど)の頭に、こう付けるだけです。
EXPLAIN ANALYZE SELECT FROM ユーザーテーブル WHERE 登録日 > ‘2023-01-01’;
これだけで、PostgreSQLが「どういう手順でデータを探したか」を教えてくれます。
ここで注目してほしいのが、以下の3つのポイントです。
- 実際の実行時間(Actual Time): どこで一番時間が食われているか。
- 行数(Rows): 予想していた数と、実際に取り出した数にズレはないか。
- ループ回数(Loops): 何回同じ作業を繰り返したか。
特に「ループ回数」が多いところは要注意です!「同じ棚に何度も何度も調味料を取りに行っている」ような状態なので、ここを改善すれば、劇的に速くなることが多いんですよ。
—
最後に:怖がらないで!
初めて出力結果を見ると、英語ばかりで「うわっ、難しい…」と思うかもしれません。でも大丈夫。最初は全部を理解しようとしなくていいんです。
まずは、「一番時間がかかっている行はどれかな?」と探すだけで十分。それだけで、あなたはもうデータベースのパフォーマンスを改善する「料理長」の一歩を踏み出せています。
クエリが遅いときは、ぜひこの魔法のコマンドを唱えてみてください。「あ、こんなところで詰まっていたんだ!」という発見が、きっとあなたのエンジニアとしての腕をぐんと引き上げてくれますよ。
また次の記事でお会いしましょう!質問があればいつでもコメント欄で教えてくださいね。
コメント