【问题标题】: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”是什么意思?

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

【问题讨论】:

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

标签: postgresql sql-execution-plan


【解决方案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 时间。

    【讨论】:

    • 这个答案与问题关系不大。
    猜你喜欢
    • 2021-08-05
    • 2019-02-15
    • 2016-01-02
    • 2021-08-02
    • 2014-09-14
    • 2019-12-10
    • 2015-03-20
    • 2020-01-07
    • 1970-01-01
    相关资源
    最近更新 更多