「なぜかデータベースが重い…」を解決する魔法の杖: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` はただの「振り返りノート」です。
「どこで時間がかかったのかな?」
「思ったより頑張っちゃってる(無駄な作業をしている)場所はないかな?」
そんなふうに、データベースと対話するような感覚で使ってみてください。きっと、今まではブラックボックスに見えていた動きが、少しずつ手に取るようにわかってくるはずです。
もし使い方がわからなくなったら、いつでもこのページを読み返してくださいね。皆さんのデータベースライフが、もっと快適なものになりますように!
コメント