PostgreSQL 查询计划中的“Plan Rows: 0”是啥意思?

Posted

技术标签:

【中文标题】PostgreSQL 查询计划中的“Plan Rows: 0”是啥意思?【英文标题】:What does “Plan Rows: 0” mean in PostgreSQL query plan?PostgreSQL 查询计划中的“Plan Rows: 0”是什么意思? 【发布时间】:2018-10-15 16:49:59 【问题描述】:

此查询在查询计划中显示“Plan Rows: 0”。

CREATE TABLE EMP (
   EMP_ID CHAR(4),
   EMP_NAME VARCHAR(200)
);
INSERT INTO EMP VALUES ( '1000', 'JOHN DOE' );
INSERT INTO EMP VALUES ( '1001', 'ALAN SMITHEE' );
INSERT INTO EMP VALUES ( '1002', 'JANE DOE' );
EXPLAIN (ANALYZE, FORMAT JSON)
   SELECT * FROM EMP WHERE EMP_ID = NULL;

结果:

[  "Plan": 
   "Node Type": "Result",
   "Parallel Aware": false,
   "Startup Cost": 0.00,
   "Total Cost": 0.00,
   "Plan Rows": 0,
   "Plan Width": 438,
   "Actual Startup Time": 0.001,
   "Actual Total Time": 0.001,
   "Actual Rows": 0,
   "Actual Loops": 1,
   "One-Time Filter": "false"
,
"Planning Time": 0.023,
"Triggers": [ ],
"Execution Time": 0.011  ]

此查询计划中的“Plan Rows: 0”是什么意思?

    PostgreSQL 没有扫描任何记录,因为EMP_ID = NULL 总是假的。 PostgreSQL 扫描了EMP 表,因为统计信息可能与实际表内容不同。

【问题讨论】:

不相关但:大多数人更喜欢使用explain (analyze, format text)(或简单的explain (analyze))的文本输出 - JSON 格式更适合通过例如自动分析。一个工具。 【参考方案1】:

PostgreSQL 检测到emp_id = NULL 始终为假,所以它根本不扫描表,而是立即返回一个空结果。

“Plan Rows”是估计的结果行数,为 0,因为 PostgreSQL 知道不可能有结果行。通常情况下,当 PostgreSQL 不能确定时,它会至少估计一个结果,以免估计不正确。

【讨论】:

【参考方案2】:

analyze 每次都会扫描表,因为您的条件始终为 false,所以它将始终返回 0 个计划行。如果您在不截断表格的情况下继续插入行,您会发现成本会随着行数的增加而增加,这是由于检查 where 条件所花费的额外时间。

来自文档https://www.postgresql.org/docs/9.2/static/using-explain.html

rows 值有点棘手,因为它不是计划节点处理或扫描的行数,而是节点发出的行数。这通常小于扫描的数量,这是通过在节点上应用的任何 WHERE 子句条件进行过滤的结果。理想情况下,***行估计将近似于查询实际返回、更新或删除的行数。

来自链接文档中显示的示例:

请注意,EXPLAIN 输出显示 WHERE 子句作为附加到 Seq Scan 计划节点的“过滤器”条件应用。 这意味着计划节点检查它扫描的每一行的条件,并仅输出通过条件的那些。由于 WHERE 子句,输出行的估计值已减少。但是,扫描仍然需要访问所有 10000 行,因此成本并没有降低;事实上,它已经上升了一点(准确地说是 10000 * cpu_operator_cost),以反映检查 WHERE 条件所花费的额外 CPU 时间。

【讨论】:

这个答案与问题关系不大。

以上是关于PostgreSQL 查询计划中的“Plan Rows: 0”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql 不同服务器上的不同查询计划

如何在 postgresql 中获取正在运行的查询的执行计划?

使用 Drill 查询获取 PostgreSQL 执行计划

Postgresql 计划不周的查询运行时间过长

PostgreSQL——查询优化——生成优化计划1

PostgreSQL——查询优化——生成优化计划1