実行計画とは何か(なぜ DB が計画を立てるのか)
実行計画とは、SQL が「何が欲しいか」しか書いていないのに対して、データベースが「どうやって取るか」を決めた手順書である。同じ結果を返す取り方が複数あるとき、オプティマイザがコストを見積もって 1 つを選ぶ。
SQL は「何が欲しいか」しか書いていない
SQL にはどうやって取るかが書かれていません。 「この条件に合う行が欲しい」としか言っていないので、取り方はデータベースが決めます。
SELECT * FROM members WHERE city = 'city-7';
この 1 行に対して、少なくとも次の取り方があります。
- テーブルを先頭から最後まで読んで、条件に合う行だけ拾う
cityのインデックスを辿って、該当する行だけ取りに行く- インデックスで該当行の位置を全部集めてから、ページ順にまとめて読む
どれも同じ結果を返します。違うのは速さだけです。 そして「どれが速いか」は、テーブルの行数や条件に合う行の割合で変わります。 だからデータベースは毎回見積もって選んでいます。
この「選んだ結果」が実行計画です。 選ぶ担当をオプティマイザ(プランナ)と呼びます。
EXPLAIN で見る
クエリの先頭に EXPLAIN を付けると、選ばれた計画が返ってきます。
ただし EXPLAIN だけだと見積りしか返りません。実測値も欲しいので、最初から EXPLAIN (ANALYZE) で打ちます。 こちらは実際にクエリを実行して、かかった時間と返った行数も返します。
EXPLAIN (ANALYZE) SELECT m.name, o.amount FROM members m JOIN orders_s o ON o.member_id = m.id WHERE m.id = 42;
Nested Loop (cost=0.85..28.26 rows=4 width=17) (actual time=0.041..0.051 rows=4.00 loops=1)
-> Index Scan using members_pkey on members m (cost=0.42..8.44 rows=1 width=17) (actual time=0.022..0.022 rows=1.00 loops=1)
Index Cond: (id = 42)
Index Searches: 1
-> Index Scan using orders_s_member_idx on orders_s o (cost=0.43..19.78 rows=4 width=8) (actual time=0.017..0.024 rows=4.00 loops=1)
Index Cond: (member_id = 42)
Index Searches: 1
Planning Time: 0.311 ms
Execution Time: 0.099 msEXPLAIN (ANALYZE) の出力。
PostgreSQL 18.6 / 2026-08-22 採取 / 並列・JIT は OFF
いまはまだ読めなくて構いません。読む順番とcost と rows の意味を押さえれば読めます。
EXPLAIN ANALYZE は本当に実行します。SELECT なら問題ありませんが、UPDATE / DELETE / INSERT で打つとデータが変わります。試すときはトランザクションを開いて 最後に ROLLBACK するのが安全です。
どこで打つか
psql(コマンドライン)
そのまま打てます。長い計画は折り返されて読みにくいので、\pset pager off にしておくと扱いやすくなります。
GUI クライアント(pgAdmin / DBeaver / TablePlus など)
クエリの実行ボタンとは別に「実行計画」のボタンがあることが多いです。テキストで見たい場合は、素直に EXPLAIN を付けて普通に実行するのが 確実です。ツールの独自ビューは見やすい代わりに、 この先で扱う loops や Rows Removed by Filter が 隠れていることがあります。
ORM 経由
- まず生成された SQL を出す。ログ出力やデバッグモードで確認できます
- その SQL をクライアントに貼って
EXPLAINを付ける - プレースホルダ(
$1など)が残っている場合は、実際の値を入れて打ちます。値によって計画が変わることがあるので、 本番で問題になっている値をそのまま使うのが大事です
次に読むもの
計画の読む順番から始めるのが最短です。 木構造だと知らないまま数字を追っても、どこから見ればいいのか分からないためです。
よくある疑問
関連トピック
もっと学びたい方へ(おすすめ書籍)
PostgreSQLの内部構造・ストレージ・インデックス機構を丁寧に解説。設計と運用計画の鉄則が学べる。
「なぜこの書き方が速いのか」を実行計画から説明する一冊。条件分岐・集約・結合・更新のそれぞれで、良い書き方と悪い書き方を対比しながら読める。
テーブル設計と正規化、パフォーマンス考慮のインデックス設計まで実務レベルで学べる定番書。第2版ではクラウド対応も強化。
ER 図をどう「使える設計」に落とすか、実務の判断まで踏み込んだ入門書。エンティティの切り出しから多対多の扱いまで具体例が豊富。
ドリル 256 問を実際に打ちながら進める SQL の入門書。付属のブラウザ環境で演習できるので、SELECT から結合・集約までを環境構築で止まらずに通せる。
SQLの本質的な使い方と、インデックスが効くクエリの書き方を学べる。ウィンドウ関数など現代SQLも網羅。
実務でやりがちなSQL・DB設計のアンチパターンとその回避策を体系的に学べる。
IPAデータベーススペシャリスト試験の総合対策書。インデックス関連は本サイトと合わせて学ぶと理解が深まる。
リレーショナルモデルの理論から、インデックス設計を含む実務で使えるSQLまで解説。
本セクションはAmazonアソシエイトのリンクを含みます。
もっと深くDBを学びたい方へ。
たいてっくが、SQL・データベース設計・パフォーマンスチューニング・IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。
「教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。」
— H 様(DB・SQL コース受講)「体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。」
— M 様(DB・SQL コース受講)「大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。」
— K 様(DB・SQL コース受講)