pg_overexplainモジュールは、EXPLAINを拡張して追加の情報を出力する新しいオプションを提供します。
これは主にプランナのデバッグと開発を支援することを目的としており、一般的な使用を目的としたものではありません。
このモジュールはプランナのデータ構造の内部詳細を表示するため、出力を理解するにはソースコードを参照する必要があるかもしれません。
さらに、これらのデータ構造が変更されるたびに(そして頻繁に)出力が変化する可能性があります。
使用するには、サーバにロードするだけです。 個々のセッションにロードすることができます。
LOAD 'pg_overexplain';
また、postgresql.confのsession_preload_librariesまたはshared_preload_librariesにpg_overexplainを含めることで、一部またはすべてのセッションで事前にロードすることもできます。
DEBUGオプションを使用すると、一般的には必要ないと想定されるために通常は表示されないさまざまなプランツリーの情報が表示されます。
個々のプランノードに対して、次のフィールドを表示します。
これらのフィールドの詳細については、nodes/plannodes.hのPlanを参照してください。
Disabled Nodes。
通常のEXPLAINは、ノードが無効化されているかどうかを判断するために、そのノードにおける無効化されたノードのカウンタが、その子ノードにおける無効化されたノードのカウンタの合計よりも多いかどうかを確認します。
このオプションでは、カウンタの値をそのまま表示します。
Parallel Safe。
プランツリーノードがGatherノードまたはGather Mergeノードの下に現れても安全かどうかを示します。
実際にこれらのノードの下にあるかどうかは関係ありません。
Plan Node ID。
プランツリー内の各ノードで一意である内部ID番号。
パラレルクエリの活動を調整するために使用されます。
extParamおよびallParam。
このプランノードまたはその子ノードに影響する番号付きパラメータに関する情報。
テキストモードでは、これらのフィールドが空の集合ではない場合にのみ表示されます。
問い合わせごとに1回、DEBUGオプションは次のフィールドを表示します。
詳細についてはnodes/plannodes.hのPlannedStmtを参照してください。
Command Type。
たとえば、selectやupdateです。
Flags。
PlannedStmt構造体の論理値型メンバのうち、trueに設定されているメンバ名をカンマで区切ったリスト。
対象となる構造体のメンバは、hasReturning、hasModifyingCTE、canSetTag、transientPlan、dependsOnRole、およびparallelModeNeededです。
Subplans Needing Rewind。
エグゼキュータによる巻き戻しが必要なサブプランの整数値ID。
Relation OIDs。
このプランに関わるリレーションのOID。
Executor Parameter Types。
各エグゼキュータパラメータの型OID(たとえば、ネステッドループが選択されて内側のインデックススキャンに値を渡すためにパラメータが使用される場合)。
ユーザがプリペアドステートメントに提供するパラメータは含まれません。
Parse Location。
プランナに渡された問い合わせ文字列内で、この問い合わせテキストが見つかる位置。
場合によってはUnknownになることがあります。
それ以外の場合、整数値NNNに対してNNN to end、または整数値NNNとMMMに対してNNN for MMM bytesになることがあります。
RANGE_TABLEオプションは、特に問い合わせの範囲テーブルに関するプランツリーの情報を表示します。
範囲テーブルの項目は問い合わせのFROM句に含まれる項目とほぼ一致しますが、多くの例外があります。
たとえば、不要であることが判明した副問い合わせは範囲テーブルから完全に削除される場合がある一方で、継承を展開するときには問い合わせで直接名前が付けられていない子テーブルに対して範囲テーブルの項目が追加されます。
範囲テーブルの項目は通常、範囲テーブルインデックス(RTI)によって問い合わせ計画内で参照されます。
1つ以上のRTIを参照するプランノードは、Scan RTI、Nominal RTI、Exclude Relation RTI、およびAppend RTIsのフィールドのいずれかを使用し、それに応じてラベルが付けられます。
さらに、問い合わせ全体では、さまざまな目的に必要な範囲テーブルインデックスのリストが保持される場合があります。
これらのリストは問い合わせごとに1回表示され、必要に応じてUnprunable RTIsまたはResult RTIsというラベルが付けられます。
テキストモードでは、これらのフィールドが空の集合ではない場合にのみ表示されます。
最後に、最も重要なのは、RANGE_TABLEオプションは問い合わせの範囲テーブル全体のダンプを表示するということです。
各範囲テーブルの項目には、適切な範囲テーブルインデックス、範囲テーブルの項目の種類(例えば、relation、subquery、またはjoinなど)のラベルが付けられ、その後に通常のEXPLAINによる出力には含まれない範囲テーブルの項目のフィールドに関する様々な内容が表示されます。
これらのフィールドの一部は、特定種類の範囲テーブルの項目でのみ表示されます。
たとえば、Erefはすべての種類の範囲テーブルの項目で表示されますが、CTE Nameはcteの範囲テーブルの項目でのみ表示されます。
範囲テーブルの項目の詳細については、nodes/plannodes.hのRangeTblEntryの定義を参照してください。
Robert Haas <rhaas@postgresql.org>