発展関連トピック

実行計画(EXPLAIN)の読み方

定義

実行計画(EXPLAIN)とは、クエリオプティマイザが選択したデータアクセス方法・結合順・見積り件数などを示す情報であり、パフォーマンスチューニングの起点になる。

EXPLAIN で「オプティマイザの計画表」を見る

クエリの前に EXPLAIN を付けて実行すると、DBが選んだ実行計画をツリーで返してきます。 「どのテーブルにどうアクセスして、どの順で結合して、どうソートするか」がここに書かれていて、パフォーマンスチューニングの読み解きの起点になります。

EXPLAIN
SELECT * FROM orders
WHERE customer_id = 42;

出力(例):

 Index Scan using idx_orders_customer_id on orders
   Index Cond: (customer_id = 42)

idx_orders_customer_id を使ってインデックス経由でアクセスしたcustomer_id = 42 という条件をインデックスにかけた──ということが読み取れます。もしインデックスが無ければ次のような出力になります:

 Seq Scan on orders
   Filter: (customer_id = 42)

こちらは全表スキャンで、テーブルの全行を舐めながらcustomer_id = 42Filter として適用しています。件数が多いと重くなります。

主なアクセス方法

Seq Scan(全表スキャン)

テーブルを先頭から順に読む。インデックスがない、使えない条件(LIKE '%foo'や関数変換など)、あるいは対象行が多すぎてインデックスの方が遅い場合に選ばれます。 RDBMSによっては「Full Table Scan」と呼ばれます。

Index Scan

B-tree を辿って該当行の行ID を取得 → その行を含むページを読む方式。 出力に Index Cond: が見えたら「インデックスが実際に使われている」証拠です。

Index Only Scan

カバリングインデックスで、必要なカラムがインデックス側にすべて含まれていて、テーブル本体を1回も読まずに済むケース。最速のパターン。 RDBMSによっては「Using index」と表現されます。

Nested Loop / Hash Join / Merge Join

JOINの3つの代表的なアルゴリズム。オプティマイザが両側のテーブルサイズと使えるインデックスから最適なものを選びます。

  • Nested Loop: 外側を1件ずつ、内側で対応する行を探す。内側にインデックスがあると速い
  • Hash Join: 一方でハッシュテーブルを作り、他方から突き合わせる。大量データ同士に向く
  • Merge Join: 両側がキー順にソート済みなら効率的にマージできる

読む順番はツリーの内側から

実行計画はインデントが深いところ(葉)から根に向かって実行されます。

 Nested Loop
   ->  Index Scan using idx_users_email      -- 先にこれ
         Index Cond: email = 'a@example.com'
   ->  Index Scan using idx_orders_customer_id  -- 次にこれ
         Index Cond: customer_id = u.id

まず外側 (users) を email インデックスで絞り込み、その結果1件ずつについて内側 (orders) のcustomer_id インデックスを引いてマッチする行を得る、という流れ。 末端のノードから読むと理解しやすいです。

どこを見ればいい?(チェックリスト)

  1. 大きなテーブルに Seq Scan が出ていないか → インデックス化の候補
  2. Nested Loopの内側が Seq Scan になっていないか → 内側にインデックスがない典型的な低速パターン
  3. 推定 rows と実測 rows の乖離 統計情報 が古い可能性
  4. 意外な JOIN アルゴリズムが選ばれていないか → 統計情報のずれで最適でない選択になっているかも

EXPLAIN と EXPLAIN ANALYZE

EXPLAIN はプランを見積りだけ返します(クエリは実行しません)。 一方 EXPLAIN ANALYZE実際にクエリを実行して、実測時間と実測行数も返します。 「推定と実測の乖離」を見るには ANALYZE 必須。

ただし ANALYZE は本当にクエリを実行するので、INSERT/UPDATE/DELETE 系で試すと本当にデータが変わります。SELECT で使うのが安全です。

よくある疑問

Q.EXPLAINとEXPLAIN ANALYZEの違いは?
A.EXPLAINは見積り(コスト・行数)だけを返しますが、EXPLAIN ANALYZEは実際にクエリを実行して実測時間・実測行数も表示します。本番でANALYZEを実行するとデータの更新も走るので注意(SELECTなら基本的に問題なし)。
Q.計画の中で見るべきポイントは?
A.アクセス方法(Seq/Index/Hash)、コスト、推定行数と実行数の乖離、結合方法、行の増減が起きる場所。特に「推定と実測の乖離が大きい」場所は統計情報が古い or 相関を捉えられていない可能性が高い。
Q.全表スキャンが出たら必ずインデックスを貼るべき?
A.件数が少ないテーブルや、対象行の割合が高いクエリでは全表スキャンの方が速いこともあります。EXPLAINは判断材料であって、コストと行数を見て総合判断します。

関連トピック

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

達人に学ぶSQL徹底指南書 第2版
ミック

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Amazon で見る →

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

オンライン個別指導

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

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

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