【入門編】 EXPLAIN ANALYZE – PostgreSQL

「なぜかデータベースが重い…」を解決する魔法の杖:EXPLAIN ANALYZE入門

こんにちは!データベースを触っていると、たまに「あれ?さっきまでサクサク動いていたはずなのに、急に遅くなった?」なんて経験、ありませんか?

特にデータが増えてくると、今まで一瞬で返ってきていたクエリが、急に「考え中……」と固まってしまう。そんな時、皆さんはどうしていますか?闇雲にクエリを書き直したり、再起動してみたり……それ、実は少しもったいないかもしれません。

今日は、そんな「データベースの迷宮入り」を解決してくれる、PostgreSQL界の超強力なツール『EXPLAIN ANALYZE』について、専門用語を抜きにしてお話ししますね。

—

「料理のレシピ」で例えてみましょう

想像してみてください。あなたはレストランのシェフです。ある料理(クエリ)の提供が遅いとクレームが入りました。

原因は何でしょうか?

  • 野菜を切るのに時間がかかっている?
  • お湯が沸くのを待っている?
  • そもそも、冷蔵庫の奥深くまで食材を探しに行っている?

これを見極めるために、厨房のカメラ映像を確認し、「どの手順に何分かかったか」を記録する……。これこそが、『EXPLAIN ANALYZE』の役割なんです。

EXPLAIN ANALYZEが教えてくれること

普段、私たちが使う「クエリ(命令文)」は、データベースにとっての「料理のレシピ」です。
`EXPLAIN` をつけると、データベースは「私はこうやって料理を作ろうと思うよ(予測)」という計画書を見せてくれます。

さらに `ANALYZE` をつけると、「実際に作ってみた結果、どこで何秒かかったか(実績)」まで事細かに報告してくれるようになります。

つまり、以下のようなことが一目瞭然になるんです。

  • 「ここがボトルネック!」: どの手順に時間がかかっているか。
  • 「予想外の出来事」: 「10個くらいしか食材がないはず」と思っていたのに、実際は「100万個の食材を全部チェックしていた」なんていう、計算違いの発見。
  • 「無駄な動き」: 冷蔵庫を何度も往復していないか。

実際に使ってみる時のステップ

使い方はとっても簡単。普段実行しているクエリの先頭に、この「魔法の呪文」を付けるだけです。

EXPLAIN ANALYZE
SELECT FROM users WHERE name = ‘田中さん’;

これを実行すると、ずらーっと結果が出てきます。最初は暗号のように見えるかもしれませんが、注目すべきはたった一つ。

「Actual time(実際の時間)」と「Rows(行数)」です。

例えば、ある行で「予想では1行見つかるはずだったのに、実際には10万行チェックしていた」なんて表示が出ていたら、「あ、ここだ!ここを効率化すれば速くなるぞ!」と確信が持てますよね。

大切なポイント:実際に「実行」されるということ

ここで一つだけ注意点。`EXPLAIN` だけなら実行はされませんが、`ANALYZE` を付けると、データベースは「実際にクエリを最後まで実行」します。

「えっ、じゃあ削除クエリ(DELETE)に付けたらデータが消えちゃうの?」と心配になるかもしれませんね。ご名答です。データ更新や削除を伴うクエリに安易に `ANALYZE` を付けるのはちょっと危険。そんな時は、トランザクション( `BEGIN;` ~ `ROLLBACK;` )で囲んで、あとで取り消せるようにしておくのが、ベテランの知恵ですよ。

最後に

データベースのチューニングと聞くと、「数学が得意じゃないと無理そう…」なんて身構えてしまうかもしれません。でも、`EXPLAIN ANALYZE` はただの「振り返りノート」です。

「どこで時間がかかったのかな?」
「思ったより頑張っちゃってる(無駄な作業をしている)場所はないかな?」

そんなふうに、データベースと対話するような感覚で使ってみてください。きっと、今まではブラックボックスに見えていた動きが、少しずつ手に取るようにわかってくるはずです。

もし使い方がわからなくなったら、いつでもこのページを読み返してくださいね。皆さんのデータベースライフが、もっと快適なものになりますように!

コメント

タイトルとURLをコピーしました