pg_overexplain
模組使用新的選項擴充套件了 EXPLAIN
,這些選項提供了額外的輸出。它主要用於協助除錯和開發查詢規劃器,而不是用於一般用途。由於該模組顯示了查詢規劃器資料結構的內部細節,因此可能需要參考原始碼才能理解輸出。此外,只要這些資料結構發生變化(無論變化頻率如何),輸出很可能隨之改變。
要使用它,只需將其載入到伺服器中。您可以將其載入到單個會話中
LOAD 'pg_overexplain';
您還可以透過在 postgresql.conf
中將 pg_overexplain
新增到 session_preload_libraries 或 shared_preload_libraries 中,將其預載入到某些或所有會話中。
DEBUG
選項顯示了計劃樹中通常不顯示的各種資訊,因為這些資訊不被認為具有普遍興趣。對於每個單獨的計劃節點,它將顯示以下欄位。有關這些欄位的更多文件,請參閱 nodes/plannodes.h
中的 Plan
。
Disabled Nodes
。正常的 EXPLAIN
透過檢查節點的停用節點計數是否大於底層節點的計數之和來確定節點是否被停用。此選項顯示原始計數器值。
Parallel Safe
。指示一個計劃樹節點是否可以安全地出現在 Gather
或 Gather Merge
節點下方,而不管它實際上是否位於此類節點下方。
Plan Node ID
。一個內部 ID 號,對於計劃樹中的每個節點都應該是唯一的。它用於協調並行查詢活動。
extParam
和 allParam
。有關哪些編號引數會影響此計劃節點或其子節點的資訊。在文字模式下,僅當這些欄位是非空集時才顯示。
對於每個查詢,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)來引用。引用一個或多個 RTI 的計劃節點將相應地標記,使用以下欄位之一:Scan RTI
、Nominal RTI
、Exclude Relation RTI
、Append RTIs
。
此外,整個查詢可能會維護為各種目的所需的範圍表索引列表。這些列表將顯示在每個查詢一次,並根據需要標記為 Unprunable RTIs
或 Result RTIs
。在文字模式下,僅當這些欄位是非空集時才顯示。
最後,但也是最重要的,RANGE_TABLE
選項將顯示查詢的整個範圍表的轉儲。每個範圍表條目都用相應的範圍表索引標記,範圍表條目的種類(例如 relation
、subquery
或 join
),然後是各種範圍表條目欄位的內容,這些欄位通常不是 EXPLAIN
輸出的一部分。其中一些欄位僅針對某些種類的範圍表條目顯示。例如,Eref
會為所有型別的範圍表條目顯示,但 CTE Name
僅為 cte
型別的範圍表條目顯示。
有關範圍表條目的更多資訊,請參閱 nodes/plannodes.h
中 RangeTblEntry
的定義。
Robert Haas <rhaas@postgresql.org>
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表格 報告文件問題。