5. パフォーマンス関連
5.3 実行計画
5.3.3 実行計画
EXPLAIN コマンドで出力される実行計画には以下のクエリー・オペレーターがありま
す。このリストは、PostgreSQL 9.6.2のソースコード(src/backend/commands/explain.c)
から検索しました。
表 60 実行計画
クエリー・オペレーター 動作 スタートアップ・コスト
Result 非テーブル問い合わせ 無
Insert INSERT文の実行
Delete DELETE文の実行
Update UPDATE文の実行
Append データの追加処理 無
Merge Append マージ処理
Recursive Union 再帰ユニオン
BitmapAnd ビットマップ検索 AND
BitmapOr ビットマップ検索 OR
Nested Loop ネステッド・ループ 無
Merge Join マージ結合 有
Hash Join ハッシュ結合 有
Seq Scan 全件検索 無
Sample Scan サンプル検索
Index Scan インデックス部分検索 無
Index Only Scan インデックスのみの部分検索
Bitmap Index Scan インデックスのビットマップ・ス
キャン
Bitmap Heap Scan ヒープのビットマップ・スキャン 有
Tid Scan TID走査プラン 無
Subquery Scan サブクエリー検索 無
Function Scan 関数スキャン 無
Values Scan 値スキャン
CTE Scan WITH句を使ったCTEスキャン
WorkTable Scan 一時テーブル検索
Foreign Scan 外部テーブル検索
Custom Scan カスタム検索
Materialize 副問い合わせ 有
表 60 実行計画(続)
クエリー・オペレーター 動作 スタートアップ・コスト
Sort ソート処理 有
Group GROUP BY句の処理 有
Aggregate 集計処理の利用 有
GroupAggregate グループ化
HashAggregate ハッシュ集計処理の利用
WindowAgg ウインドウ集計処理
Unique DISTINCT / UNION句の処理 有
SetOp INTERCEPT / EXCEPT句の処理 有
HashSetOp ハッシュ処理
LockRows ロック
Limit LIMIT句の処理 有(OFFSET > 0)
Hash ハッシュ処理 有
Parallel Seq Scan パラレル全件検索
Finalize Aggregate パラレル処理の最終集計
Gather パラレル・ワーカーの集約
Partial Aggregate パラレル処理の集計
Partial HashAggregate Partial GroupAggregate
Single Copy 単一プロセスで実行
以下に代表的なクエリー・オペレーターの説明を記述します。
□ Sort
ORDER BY句で明示的に指定される場合やUnique処理、Merge Join処理などによる
暗黙のソートでも実行される可能性があります。
□ Index Scan
インデックスからテーブルを検索します。Index Cond実行計画が表示されない場合はイ ンデックスのフルスキャンを指します。
□ Index Only Scan
インデックスから必要な情報をすべて取得し、テーブルに検索を行いません。ただしビジ ビリティ・マップを参照した結果、テーブルにアクセスする場合もあります。
□ Bitmap Scan
BitmapOr と BitmapAnd を使ってリレーション全体のビットマップをメモリー内で作
成します。
□ Result
テーブルにアクセスせずに結果を返す場合に表示されます。
□ Unique
重複値を排除します。UNION句、DISTIMCT句の処理で使用されます。
□ Limit
ORDER BY句と共にLIMIT句が指定された場合に使用されます。
□ Aggregate
集計関数、GROUP BY句で使用されます。HashAggregate、GroupAggregateが使用さ れる場合があります。
□ Append
UNION (ALL) によるデータの追加処理で使用されます。
□ Nested Loop
INNER JOIN、LEFT OUTER JOINで使用されます。外部テーブルをスキャンし、内部
テーブルにマッチするレコードを検索します。
□ Merge Join
Merge Right JoinとMerge In Joinがあります。ソートされたレコードセットを結合さ
せます。
□ Hash, Hash Join
ハッシュ・テーブルを作成し、2つのテーブルを比較します。ハッシュ・テーブルの作成 のために初期コストが必要です。
□ Tid Scan
Tuple Id (ctid)を指定した検索で使用されます。
□ Function
関数がレコードを生成する場合に使用されます(SELECT * FROM func()等)。
□ SetOp
INTERSECT句、INTERSECT ALL句、EXCEPT句、EXCEPT ALL句の処理で使用
されます。
実行計画を作成するプランナーが選択するクエリー・オペレーターを制御するパラメー ターは以下の通りです。これらのパラメーターの設定値はデフォルトでonになっています。
これらのパラメーターをoffに設定しても、指定したクエリー・オペレーターが完全に禁止 されるわけではありません。
パラメーターをoffに指定すると、スタートアップ・コストに1.0e10(10,000,000,000)
が追加されて実行計画が比較されます。
表 61 実行計画を制御するパラメーター
パラメーター 説明 デフォルト値
enable_bitmapscan ビットマップ・スキャンの実行 on
enable_indexscan インデックス・スキャンの実行 on
enable_tidscan TIDスキャンの実行 on
enable_seqscan シーケンシャル・スキャンの実行 on
enable_hashjoin ハッシュ結合の実行 on
enable_mergejoin マージ結合の実行 on
enable_nestloop ネストループ結合の実行 on
enable_hashagg ハッシュ集約の実行 on
enable_material 問い合わせプランナーの具体化のの実行 on
enable_sort ソート処理の実行 on
enable_indexonlyscan インデックスのみで検索を完了 on
下記 の例では シーケンシャ ル・スキ ャンのみが実 行される 環境で、パラ メータ ー
enable_seqscan の値を off に設定しています。初期コストが大きくなりますが、シーケン
シャル・スキャン(Seq Scan)が行われていることがわかります。
例 134 パラメーターenable_seqscanの変更