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=4FORMAT オプション
プログラムから処理する場合は、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
プランを読む手順
- 遅いクエリに対して EXPLAIN ANALYZE を実行します
actual timeが最も大きいノードを見つけます- 推定
rowsとactual rowsを比較します - インデックスが使用されているか確認します
- インデックスの追加、書き換え、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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- EXPLAINとEXPLAIN ANALYZEの読み方
- シーケンシャルスキャンとインデックススキャン
- Hash Join、Merge Join、Nested Loop
- 遅いクエリの特定と修正