【テクニカル・上級編】 EXPLAINオプション – PostgreSQL

実行計画の「行間」を読み解く:PostgreSQLのEXPLAINオプションを極める

現場で「このクエリ、遅いんだけどどうにかならない?」と相談されたとき、みなさんはまず何をしますか? ほとんどのエンジニアは反射的に `EXPLAIN ANALYZE` を叩くはずです。

しかし、出力されたツリーを見て、なんとなく「Seq Scanか、じゃあインデックス貼るか」といった浅い考察で終わらせてはいませんか? PostgreSQLが提示する実行計画には、実はもっと深い「行間」が隠されています。今回は、その行間を読み解くために欠かせない、玄人好みのオプションたちを深掘りしてみましょう。

—

BUFFERS:キャッシュの「熱量」を可視化する

個人的に、トラブルシューティングで最も信頼しているのが `BUFFERS` オプションです。

`EXPLAIN (ANALYZE, BUFFERS)` を使うと、その処理がいかに「メモリ(Shared Buffer)」を使い、いかに「ストレージ(ディスク)」に依存しているかが数値で現れます。

  • Shared Hit: メモリ上で解決できたブロック数
  • Shared Read: ディスクから読み込まなければならなかったブロック数

もし `Shared Read` が異常に多いなら、それはインデックスが効いていないだけでなく、ワーキングセットが共有バッファに収まりきっていない(あるいはI/Oのボトルネック)という、より構造的な問題を突きつけています。単に「遅い」ではなく、「どこでI/Oが悲鳴を上げているか」を特定するための必携ツールです。

VERBOSE:プランナの「言い訳」を聞く

クエリがなぜそのパスを選んだのか、プランナの思考回路を追いかけたいときに `VERBOSE` は非常に有効です。

特に、JOINの条件式やフィルタリングで、プランナが内部的にどんな暗黙のキャストを行っているか、あるいはどのカラムをどの順序で参照しているかを詳細に出力してくれます。複雑なサブクエリやCTEが絡むとき、プランナが「なぜこのテーブルを先にスキャンしたのか」という動機を理解する手がかりになります。プランナの「迷い」を読み解くには、このオプションで十分な詳細情報を引き出すのが最短距離です。

SETTINGS:見えない「環境変数」を暴く

たまに発生する、「開発環境では速いのに本番では遅い」という悪魔のような現象。その原因の多くは、実は実行時のGUC設定の差異にあります。

`SETTINGS` オプションを付けると、実行計画の出力と一緒に、そのクエリが実行された際の `work_mem` や `random_page_cost` といったパラメータの状態が表示されます。これで、「実は本番機だけ `enable_seqscan` がOFFになっていた」とか「`work_mem` が極端に小さく、Hash Joinがディスクに溢れていた」といった、設定周りの落とし穴を即座に発見できます。

WAL:書き込み負荷の解像度を上げる

あまり知られていませんが、`EXPLAIN (ANALYZE, WAL)` は、そのクエリがどれだけのWAL(Write Ahead Log)を生成したかを示してくれます。

大量の更新を伴うバッチ処理や、一時テーブルを多用する複雑なクエリにおいて、「クエリそのもののコスト」だけでなく「チェックポイントの頻度やレプリケーションへの負荷」を推測する強力な根拠になります。データベースの性能は、何も読み取りだけではありません。書き込み負荷の重さを定量化できるのは、大規模システムを運用する上での大きな武器です。

TIMING:あえてOFFにする勇気

最後に少しトリッキーな話を。`TIMING OFF` です。

通常、`EXPLAIN ANALYZE` は実行時間を計測しますが、この計測そのものがシステムコールを呼び出すため、非常に小さなクエリをループさせて実行する場合など、計測コスト自体が実行計画に影響を与えることがあります。

「計測によるオーバーヘッドを極限まで排除して、純粋なスループットやI/Oの特性を見たい」という極端な状況下では、このオプションが真価を発揮します。まあ、滅多に使いませんが、ここぞという時の「最後の切り札」として頭の片隅に置いておいてください。

—

最後に:プランナと対話する技術

実行計画は、PostgreSQLからの「手紙」です。

`EXPLAIN` オプションを使いこなすということは、単にコマンドを叩くことではなく、データベースがなぜその選択をしたのかという「意図」を理解することに他なりません。VERBOSEで論理構造を追い、BUFFERSでI/Oの熱量を感じ、SETTINGSで環境の整合性を確かめる。

これらのオプションを駆使して「データベースの思考」に寄り添えるようになれば、あなたのチューニングスキルは間違いなく一段上の領域へ到達します。

さあ、次はどのクエリの「本音」を聞き出しに行きますか?

コメント

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