PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

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

F.29.1. EXPLAIN (DEBUG)
F.29.2. EXPLAIN (RANGE_TABLE)
F.29.3. 作者

pg_overexplain 模块用提供额外输出的新选项扩展了 EXPLAIN。它主要用于协助规划器的调试与开发,面向普通使用场景的价值有限。由于该模块显示规划器数据结构的内部细节,可能需要参考源代码才能理解输出。此外,只要(而且每当)那些数据结构发生变化,输出也很可能随之改变。

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

LOAD 'pg_overexplain';

也可以通过在 postgresql.conf 中将 pg_overexplain 加入 session_preload_libraries 或 shared_preload_libraries,将其预加载到部分或全部会话。

F.29.1. EXPLAIN (DEBUG) #

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。

F.29.2. EXPLAIN (RANGE_TABLE) #

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/parsenodes.h 中 RangeTblEntry 的定义。

F.29.3. 作者 #

Robert Haas