

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# EXPLAIN クエリプラン
<a name="explain-query-plan"></a>

PostgreSQL には、クエリの実行方法の詳細を含むクエリプランを返すための `EXPLAIN`および `EXPLAIN ANALYZE`オプションが用意されています。

## EXPLAIN ステートメント
<a name="explain"></a>

`EXPLAIN` ステートメントは、PostgreSQL プランナーが特定のステートメントに対して生成するクエリプランを返します。クエリプランには、以下が表示されます。
+ ステートメントに関係するテーブルのスキャン方法 (インデックススキャンやシーケンシャルスキャンなど）
+ 複数のテーブルを結合する方法 (ハッシュ結合、マージ結合、ネストされたループ結合など）

クエリのパフォーマンスを向上させるには、計画を理解することが不可欠です。計画を理解したら、クエリに時間がかかりすぎている箇所に集中し、時間を短縮するためのアクションを実行できます。

## EXPLAIN ANALYZE の使用
<a name="explain-analyze"></a>

PostgreSQL では、 `EXPLAIN`は指定されたステートメントの計画のみを生成します。`ANALYZE` キーワードを追加すると、 `EXPLAIN`はプランを返し、クエリを実行し、各ステップの実際のランタイムと行数を表示します。これはクエリのパフォーマンスを分析するために不可欠です。

**重要**  
を使用する場合は`EXPLAIN ANALYZE`、`INSERT`、、`UPDATE`および に注意してください`DELETE`。

## EXPLAIN クエリプランの読み方
<a name="read"></a>

PostgreSQL クエリプランは、複数のノードで構成されるツリー構造です*。*`EXPLAIN` クエリプランには、データベースエンジンがクエリの実行に使用するステップが表示されます。クエリプランには、次の情報が表示されます。
+ シーケンシャルスキャン、インデックススキャン、ネストされたループ結合など、実行されるオペレーションのタイプ。
+ 実行中のオペレーションを記述する `Seq Scan``Index Scan`、`Nested Loop`、 などのラベル。
+ クエリによって処理されるテーブルまたはインデックスの名前。
+ 任意の計算単位の推定コストと処理された行数に関する情報を含むコストと行列。
+ 条件など、オペレーションに適用されるフィルターのフィルター`where`条件。
+ ステップを視覚的に表現し、各オペレーションをノードとして表示し、オペレーションを接続する矢印を示します。オペレーションの順序は左から右に示され、以前のオペレーションは後のオペレーションにフィードされます。

次のスクリーンショットは、シーケンシャルスキャンのクエリプランを示しています。



![\[pgAdmin のデータ出力タブに表示されるクエリプラン。\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/postgresql-query-tuning/images/query-plan.png)


コスト見積もりは、PostgreSQL がクエリが結果を返すために 32.60 単位の計算を必要とすることを想定している`(cost=0.00..32.60 rows=2260 width=8)`ことを意味します。

`0.00` 値は、このノードが動作を開始できるコストです (この場合は、クエリの起動時間）。`rows` 値は、シーケンシャルスキャンが返す推定行数です。`width` 値は、返された行のバイト単位の推定サイズです。

この例では `ANALYZE`オプション`EXPLAIN`を指定しているため、クエリが実行され、タイミング情報がキャプチャされました。結果は次の`(actual time=0.120..0.121 rows=1 loops=1)`ことを意味します。
+ シーケンシャルスキャンが 1 回 ( `loops` 値) 実行されました。
+ スキャンは 1 行を返しました。
+ 実際の時間は 0.12 ミリ秒でした。