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”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章