受支持版本: 当前版本 (18)
开发版本: devel

F.29. pg_overexplain — 允许 EXPLAIN 输出更多细节 #

pg_overexplain模块通过新增选项扩展了 EXPLAIN,以提供额外输出。它主要用于辅助规划器的 调试和开发,而非供一般使用。由于该模块会显示规划器数据结构的内部细节, 要理解这些输出,可能需要查阅源代码。此外,每当这些数据结构发生变化时, 输出都很可能随之变化,而且变化可能相当频繁。

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

LOAD 'pg_overexplain';

也可以将pg_overexplain加入 session_preload_librariesshared_preload_libraries(位于 postgresql.conf中), 从而在部分或全部会话中预加载它。

F.29.1. EXPLAIN (DEBUG) #

DEBUG选项显示计划树中的一些杂项信息,这些信息通常不会 展示,因为一般认为它们并不具有普遍意义。对于每个单独的计划节点,它会 显示以下字段。关于这些字段的更多文档,请参见 Plan(定义见nodes/plannodes.h)。

  • Disabled Nodes。 常规的EXPLAIN会通过检查某个节点的禁用节点计数是否 大于其底层节点计数之和,来判断该节点是否被禁用。此选项显示原始计数值。

  • Parallel Safe。 指示某个计划树节点出现在GatherGather Merge节点之下是否安全,而不管它实际上是否位于 这类节点之下。

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

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

对于每个查询,DEBUG选项还会显示以下字段一次。更多 细节参见PlannedStmt(定义见 nodes/plannodes.h)。

  • 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选项显示计划树中专门与查询的范围表 (range table)有关的信息。范围表条目大致对应于查询 FROM子句中出现的各项,但也有许多例外。例如,被证明 不必要的子查询可能会从范围表中被完全删除,而继承展开则会为查询中未直接 命名的子表添加范围表条目。

在查询计划中,范围表条目通常通过范围表索引(range table index,RTI) 来引用。引用了一个或多个 RTI 的计划节点会使用以下字段之一进行标注: Scan RTINominal RTIExclude Relation RTIAppend RTIs

此外,整个查询还可能维护若干用于不同目的的范围表索引列表。这些列表会在 每个查询中显示一次,并按适当名称标注为 Unprunable RTIsResult RTIs。 在文本模式下,仅当这些字段为非空集合时才会显示。

最后也是最重要的,RANGE_TABLE选项会显示整个查询范围表 的转储结果。每个范围表条目都会标出相应的范围表索引、范围表条目的类型 (例如relationsubqueryjoin),然后列出若干通常不属于 EXPLAIN输出内容的范围表条目字段。其中某些字段只会在 特定类型的范围表条目上显示。例如,Eref会对所有类型的 范围表条目显示,而CTE Name只会对类型为 cte的范围表条目显示。

关于范围表条目的更多信息,请参见 RangeTblEntry的定义(见 nodes/parsenodes.h)。

F.29.3. 作者 #

Robert Haas

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。