0Pricing
SQL Academy · レッスン

EXPLAINとEXPLAIN ANALYZEの読み方

プランツリーを読み取り、コストと実際の時間の違いを理解して、負荷の高いノードを見つけます。

「EXPLAINとEXPLAIN ANALYZEの読み方」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。

EXPLAIN とは

EXPLAIN は、クエリを実行せずに、プランナーがクエリを実行するための戦略を表示します。EXPLAIN ANALYZE はクエリを実行し、実際の実行時間も表示します。

基本的な EXPLAIN

推定された実行計画を表示します。

EXPLAIN SELECT * FROM orders WHERE user_id = 42;
--                            QUERY PLAN
-- ---------------------------------------------------------------
-- Index Scan using orders_user_id_idx on orders
--   (cost=0.43..8.45 rows=5 width=120)
--   Index Cond: (user_id = 42)

EXPLAIN ANALYZE

クエリを実行し、実際の実行時間と行数を追加して表示します。

EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 42;
-- Index Scan using orders_user_id_idx on orders
--   (cost=0.43..8.45 rows=5 width=120)
--   (actual time=0.041..0.043 rows=4 loops=1)
-- Planning Time: 0.082 ms
-- Execution Time: 0.057 ms

ツリーの読み方

実行計画はツリー構造です。インデントは子ノードを表し、子ノードは親ノードより先に実行されます。

Aggregate
  -> Hash Join
     Hash Cond: (o.user_id = u.id)
     -> Seq Scan on orders
     -> Hash
        -> Seq Scan on users

コストと時間

cost 列には、startup_cost と total_cost の2つの数値があります。これらは秒数ではなく、プランナー独自の単位です。実際の値を確認するには actual time を使用してください。

rows = 推定値、actual rows = 実測値

rows はプランナーによる推定値です。actual rows は実際に処理された行数です。両者が大きく異なる場合、統計情報が不正確です。

loops は時間を乗算する

ネストしたループでは、actual time=X loops=N は各反復に X の時間がかかったことを意味します。各ノードの合計時間は X×N です。

Nested Loop  (actual time=0.05..2.03 rows=500)
  -> Seq Scan on orders  (actual ... loops=1)
  -> Index Scan using users_pkey  (actual time=0.01..0.01 loops=500)

BUFFERS は I/O を示す

EXPLAIN (ANALYZE, BUFFERS) は、タイミングの裏側にある I/O、つまりバッファヒット数と読み取り数を報告します。

EXPLAIN (ANALYZE, BUFFERS) SELECT ...;
-- Buffers: shared hit=12 read=4

FORMAT オプション

プログラムから処理する場合は、JSON または YAML を使用します。

EXPLAIN (ANALYZE, FORMAT JSON) SELECT ...;

破壊的な文では EXPLAIN ANALYZE を使用しない

UPDATE/DELETE/INSERT に対する EXPLAIN ANALYZE は、実際に処理を実行します。コミットせずに内容を調べたい場合は、トランザクションでラップして ROLLBACK します。

BEGIN;
EXPLAIN ANALYZE DELETE FROM orders WHERE ...;
ROLLBACK;

一般的なプランノード

  • Seq Scan — テーブル全体を読み取ります
  • Index Scan — インデックスを使用します
  • Bitmap Heap Scan — 複数のインデックスを組み合わせます
  • Hash Join / Merge Join / Nested Loop — 結合方式です
  • Sort、Aggregate、Limit、Materialize

プランを読む手順

  1. 遅いクエリに対して EXPLAIN ANALYZE を実行します
  2. actual time が最も大きいノードを見つけます
  3. 推定 rows と actual rows を比較します
  4. インデックスが使用されているか確認します
  5. インデックスの追加、書き換え、ANALYZE を繰り返します

まとめ

EXPLAIN ANALYZE は、パフォーマンス調査の主要なツールです。

  • コストは相対値ですが、時間は実測値です
  • 推定行数と実際の行数の差から、統計情報の問題が分かります
  • BUFFERS は I/O を示します
  • 破壊的なクエリは BEGIN; ... ROLLBACK でラップします

確認問題

EXPLAIN と EXPLAIN ANALYZE の違いは何ですか。

よくある質問

「EXPLAINとEXPLAIN ANALYZEの読み方」レッスンは無料ですか?

はい。「EXPLAINとEXPLAIN ANALYZEの読み方」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。

「EXPLAINとEXPLAIN ANALYZEの読み方」で何を学びますか?

プランツリーを読み取り、コストと実際の時間の違いを理解して、負荷の高いノードを見つけます。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

SQL Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「EXPLAINとEXPLAIN ANALYZEの読み方」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSQL Academyレッスンでコードを書いて実行できますか?

はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. EXPLAINとEXPLAIN ANALYZEの読み方
  2. シーケンシャルスキャンとインデックススキャン
  3. Hash Join、Merge Join、Nested Loop
  4. 遅いクエリの特定と修正
← SQL Academyに戻る