PostgreSQL実行計画ビューア

PostgreSQLの EXPLAIN (ANALYZE, FORMAT JSON) の出力を貼り付けると、実行計画をノードのツリーとして表示するツールです。ノード種別、推定行数、実測行数、ループ回数、実測時間を確認でき、ループ回数を考慮した自身の時間や推定行数と実測行数のずれを強調します。DB接続は行わず、すべてブラウザ内で処理されます。

実行計画はサーバーへ送信されず、解析はすべてブラウザ内で行われます。DBへの接続やSQLの実行は行いません。

EXPLAIN (ANALYZE, FORMAT JSON) の出力を貼り付けると、実行計画のツリーが表示されます。

使い方

  1. 検証環境などで EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON) SELECT ...; を実行し、出力を取得します。
  2. 出力を貼り付けるか、ファイルを読み込みます。psqlの表形式で出力された見出しや行末の + は自動で取り除いて読み込みます。
  3. 上部の概要で、自身の時間が長いノードと、推定行数と実測行数のずれが大きいノードを確認します。
  4. ツリーで各ノードを展開・折りたたみし、条件(Filter・Index Cond など)や除外された行数を確認します。

このツールについて

遅いSQLの原因は、実行計画のどこで時間がかかっているか、プランナーの推定行数が実際と大きくずれていないかを見ると分かることが多くあります。このツールは、読みにくいJSON形式の実行計画をツリーにして、そうした箇所を強調します。

PostgreSQLの実測時間と行数は1ループあたりの値で、子ノードの時間を含みます。このツールはループ回数を掛けた合計から子ノードの時間を引いて「自身」の時間を概算するため、各ノードの時間を単純に足し合わせて誤解することがありません。並列実行(Gather配下)はプロセス数で割って概算します。

ANALYZEなしの計画では、実測値を0ではなく「—」として表示します。推定行数が0の場合も最低1行として比較するため、計算エラーにはなりません。DBへの接続やSQLの実行は行わず、貼り付けた計画だけを解析します。

最小例として [{"Plan":{"Node Type":"Seq Scan","Relation Name":"users","Plan Rows":10}}] を入力すると、usersを対象にしたSeq Scanのツリーが表示されます。実測情報を含まないため、実測時間を0と断定せず、取得されていない値として扱います。

推定行数と実測行数のずれは調査の手掛かりですが、それだけで特定のインデックスが必要とは決まりません。条件や実行回数も合わせて読みます。ここで解析するのは貼り付けたJSONだけで、ブラウザからPostgreSQLへ問い合わせることはありません。

よくある質問

テキスト形式のEXPLAINには対応していますか?

初期版は FORMAT JSON の出力のみに対応しています。EXPLAIN (ANALYZE, FORMAT JSON) で取得してください。

「自身」の時間は正確ですか?

概算です。CTEやInitPlan、並列実行では時間の計上方法が異なるため、ずれる場合があります。負になる場合は0として表示します。

本番DBの実行計画を貼り付けても安全ですか?

計画はサーバーへ送信されず、ブラウザ内だけで解析されます。ただし EXPLAIN ANALYZE は実際にSQLを実行するため、取得は検証環境で行うことをおすすめします。