2025年9月25日: PostgreSQL 18 发布!
支持版本: 当前 (18)
开发版本: devel

F.29. pg_overexplain — 允许 EXPLAIN 转储更多详细信息 #

pg_overexplain 模块使用新的选项扩展了 EXPLAIN,这些选项提供了额外的输出。它主要用于协助调试和开发查询规划器,而不是用于一般用途。由于该模块显示了查询规划器数据结构的内部细节,因此可能需要参考源代码才能理解输出。此外,只要这些数据结构发生变化(无论变化频率如何),输出很可能随之改变。

要使用它,只需将其加载到服务器中。您可以将其加载到单个会话中

LOAD 'pg_overexplain';

您还可以通过在 postgresql.conf 中将 pg_overexplain 添加到 session_preload_librariesshared_preload_libraries 中,将其预加载到某些或所有会话中。

F.29.1. EXPLAIN (DEBUG) #

DEBUG 选项显示了计划树中通常不显示的各种信息,因为这些信息不被认为具有普遍兴趣。对于每个单独的计划节点,它将显示以下字段。有关这些字段的更多文档,请参阅 nodes/plannodes.h 中的 Plan

  • Disabled Nodes。正常的 EXPLAIN 通过检查节点的禁用节点计数是否大于底层节点的计数之和来确定节点是否被禁用。此选项显示原始计数器值。

  • Parallel Safe。指示一个计划树节点是否可以安全地出现在 GatherGather Merge 节点下方,而不管它实际上是否位于此类节点下方。

  • Plan Node ID。一个内部 ID 号,对于计划树中的每个节点都应该是唯一的。它用于协调并行查询活动。

  • extParamallParam。有关哪些编号参数会影响此计划节点或其子节点的信息。在文本模式下,仅当这些字段是非空集时才显示。

对于每个查询,DEBUG 选项将显示以下字段。有关更多详细信息,请参阅 nodes/plannodes.h 中的 PlannedStmt

  • Command Type。例如,selectupdate

  • Flags。来自 PlannedStmt 的布尔结构成员名称的逗号分隔列表,这些成员设置为 true。它涵盖以下结构成员:hasReturninghasModifyingCTEcanSetTagtransientPlandependsOnRoleparallelModeNeeded

  • Subplans Needing Rewind。可能需要由执行器重绕的子计划的整数 ID。

  • Relation OIDs。此计划所依赖的关系的 OID。

  • Executor Parameter Types。每个执行器参数的类型 OID(例如,当选择嵌套循环并使用参数将值传递给内部索引扫描时)。不包括用户提供给预备语句的参数。

  • Parse Location。查询字符串中提供给查询规划器的位置,可以在其中找到此查询的文本。在某些上下文中可能是 Unknown。否则,对于某些整数 NNN 可能是 NNN to end,对于某些整数 NNNMMM 可能是 NNN for MMM bytes

F.29.2. EXPLAIN (RANGE_TABLE) #

RANGE_TABLE 选项显示了计划树中与查询的范围表特别相关的信息。范围表条目大致对应于查询 FROM 子句中出现的项,但有许多例外。例如,已被证明不必要的子查询可能被完全从范围表中删除,而继承扩展会为未在查询中直接命名的子表添加范围表条目。

范围表条目通常在查询计划中通过范围表索引(RTI)来引用。引用一个或多个 RTI 的计划节点将相应地标记,使用以下字段之一:Scan RTINominal RTIExclude Relation RTIAppend RTIs

此外,整个查询可能会维护为各种目的所需的范围表索引列表。这些列表将显示在每个查询一次,并根据需要标记为 Unprunable RTIsResult RTIs。在文本模式下,仅当这些字段是非空集时才显示。

最后,但也是最重要的,RANGE_TABLE 选项将显示查询的整个范围表的转储。每个范围表条目都用相应的范围表索引标记,范围表条目的种类(例如 relationsubqueryjoin),然后是各种范围表条目字段的内容,这些字段通常不是 EXPLAIN 输出的一部分。其中一些字段仅针对某些种类的范围表条目显示。例如,Eref 会为所有类型的范围表条目显示,但 CTE Name 仅为 cte 类型的范围表条目显示。

有关范围表条目的更多信息,请参阅 nodes/plannodes.hRangeTblEntry 的定义。

F.29.3. 作者 #

Robert Haas

提交更正

如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表格 报告文档问题。