基礎読めるようになる

実行計画とは何か(なぜ 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 ms

EXPLAIN (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 を付けて普通に実行するのが 確実です。ツールの独自ビューは見やすい代わりに、 この先で扱う loopsRows Removed by Filter が 隠れていることがあります。

ORM 経由

  • まず生成された SQL を出す。ログ出力やデバッグモードで確認できます
  • その SQL をクライアントに貼って EXPLAIN を付ける
  • プレースホルダ($1 など)が残っている場合は、実際の値を入れて打ちます。値によって計画が変わることがあるので、 本番で問題になっている値をそのまま使うのが大事です

次に読むもの

計画の読む順番から始めるのが最短です。 木構造だと知らないまま数字を追っても、どこから見ればいいのか分からないためです。

よくある疑問

Q.EXPLAIN を打つとクエリは実行されますか?
A.EXPLAIN だけなら実行されません。見積りを返すだけです。EXPLAIN ANALYZE は実際に実行するので、UPDATE や DELETE で打つと本当にデータが変わります。
Q.実行計画は毎回同じですか?
A.同じとは限りません。統計情報が更新されたり、テーブルの行数が変わったり、設定が違えば別の計画が選ばれます。だから「前は速かったのに急に遅くなった」が起きます。
Q.ORM を使っていても実行計画は見られますか?
A.見られます。多くの ORM は生成した SQL を出力する機能を持っているので、その SQL の先頭に EXPLAIN を付けて DB クライアントで実行します。Rails のように .explain を持つものもあります。

関連トピック

もっと学びたい方へ(おすすめ書籍)

[改訂3版]内部構造から学ぶPostgreSQL
勝俣智成 ほか

PostgreSQLの内部構造・ストレージ・インデックス機構を丁寧に解説。設計と運用計画の鉄則が学べる。

Amazon で見る →
SQL実践入門 ── 高速でわかりやすいクエリの書き方
ミック

「なぜこの書き方が速いのか」を実行計画から説明する一冊。条件分岐・集約・結合・更新のそれぞれで、良い書き方と悪い書き方を対比しながら読める。

Amazon で見る →
おすすめ
達人に学ぶDB設計徹底指南書 第2版
ミック

テーブル設計と正規化、パフォーマンス考慮のインデックス設計まで実務レベルで学べる定番書。第2版ではクラウド対応も強化。

Amazon で見る →
おすすめ
楽々ERDレッスン (CodeZine BOOKS)
羽生章洋

ER 図をどう「使える設計」に落とすか、実務の判断まで踏み込んだ入門書。エンティティの切り出しから多対多の扱いまで具体例が豊富。

Amazon で見る →
おすすめ
スッキリわかるSQL入門 第4版 ドリル256問付き!
中山清喬/飯田理恵子

ドリル 256 問を実際に打ちながら進める SQL の入門書。付属のブラウザ環境で演習できるので、SELECT から結合・集約までを環境構築で止まらずに通せる。

Amazon で見る →
達人に学ぶSQL徹底指南書 第2版
ミック

SQLの本質的な使い方と、インデックスが効くクエリの書き方を学べる。ウィンドウ関数など現代SQLも網羅。

Amazon で見る →
SQLアンチパターン 第2版
Bill Karwin

実務でやりがちなSQL・DB設計のアンチパターンとその回避策を体系的に学べる。

Amazon で見る →
情報処理教科書 データベーススペシャリスト 2025年版
三好康之

IPAデータベーススペシャリスト試験の総合対策書。インデックス関連は本サイトと合わせて学ぶと理解が深まる。

Amazon で見る →
理論から学ぶデータベース実践入門
奥野幹也

リレーショナルモデルの理論から、インデックス設計を含む実務で使えるSQLまで解説。

Amazon で見る →

本セクションはAmazonアソシエイトのリンクを含みます。

オンライン個別指導

もっと深くDBを学びたい方へ。

たいてっくが、SQL・データベース設計・パフォーマンスチューニング・IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。

無料相談を予約する →
受講者の声 (DB・SQL コース)
menta レビュー原文を見る →
  • 教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。
    H 様DB・SQL コース受講
  • 体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。
    M 様DB・SQL コース受講
  • 大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。
    K 様DB・SQL コース受講