F.29. pg_overexplain — 允许 EXPLAIN 输出更多细节 #
pg_overexplain 模块通过新增选项扩展了
EXPLAIN,以提供额外输出。它主要用于辅助规划器的调试和开发,而非供一般使用。由于该模块会显示规划器数据结构的内部细节,要理解这些输出,可能需要查阅源代码。此外,每当这些数据结构发生变化时,输出都很可能随之变化,而且变化可能相当频繁。
要使用它,只需将其加载到服务器中即可。可以将其加载到单个会话中:
LOAD 'pg_overexplain';
也可以将 pg_overexplain 加入 session_preload_libraries 或 shared_preload_libraries(位于
postgresql.conf 中),从而在部分或全部会话中预加载它。
F.29.1. EXPLAIN (DEBUG) #
DEBUG 选项显示计划树中的一些杂项信息,这些信息通常不会展示,因为一般认为它们并不具有普遍意义。对于每个单独的计划节点,它会显示以下字段。关于这些字段的更多文档,请参见
Plan(定义见 nodes/plannodes.h)。
Disabled Nodes。常规的EXPLAIN会通过检查某个节点的禁用节点计数是否大于其底层节点计数之和,来判断该节点是否被禁用。此选项显示原始计数值。Parallel Safe。指示某个计划树节点出现在Gather或Gather Merge节点之下是否安全,而不管它实际上是否位于这类节点之下。Plan Node ID。一个内部 ID 号,原则上应对计划树中的每个节点都唯一。它用于协调并行查询活动。extParam和allParam。关于哪些编号参数会影响该计划节点或其子节点的信息。在文本模式下,仅当这些字段为非空集合时才会显示。
对于每个查询,DEBUG 选项还会显示以下字段一次。更多细节参见 PlannedStmt(定义见
nodes/plannodes.h)。
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。
F.29.2. EXPLAIN (RANGE_TABLE) #
RANGE_TABLE 选项显示计划树中专门与查询的范围表(range table)有关的信息。范围表条目大致对应于查询
FROM 子句中出现的各项,但也有许多例外。例如,被证明不必要的子查询可能会从范围表中被完全删除,而继承展开则会为查询中未直接命名的子表添加范围表条目。
在查询计划中,范围表条目通常通过范围表索引(range table index,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 的范围表条目显示。
关于范围表条目的更多信息,请参见
RangeTblEntry 的定义(见
nodes/parsenodes.h)。
F.29.3. 作者 #
Robert Haas <rhaas@postgresql.org>
报告文档问题
阅读 上游文档. 通过 PostgreSQL 文档反馈表单.