此查询在查询计划中显示“计划行: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 } ]
此查询计划中的“计划行:0”是什么意思?
EMP_ID = NULL
始终为假。EMP
表,因为统计信息可能与表的实际内容不同。答案 0 :(得分:1)
PostgreSQL检测到emp_id = NULL
始终为假,因此它根本不扫描表,但立即返回空结果。
“计划行”是结果行的估计数量,为0,因为PostgreSQL 知道没有结果行。通常,当无法确定PostgreSQL时,它将估计至少一个结果,以免在估计不正确时避免非常糟糕的计划。
答案 1 :(得分:-2)
分析每次都会扫描表,并且由于您的条件始终为假,因此它将始终返回0个计划的行。如果您继续插入行而不截断表,由于花了检查where条件的额外时间,随着行数的增加,开销将开始增加。
摘自文档https://www.postgresql.org/docs/9.2/static/using-explain.html:
行数有点棘手,因为它不是计划节点处理或扫描的行数,而是节点发出的数。由于被节点上应用的任何WHERE子句条件过滤,结果通常少于扫描的数目。理想情况下,顶层行估算应近似于查询实际返回,更新或删除的行数。
来自链接文档中显示的示例:
请注意,EXPLAIN输出显示WHERE子句被应用为附加到Seq扫描计划节点的“过滤器”条件。 这意味着计划节点检查其扫描的每一行的条件,并仅输出通过条件的行。由于使用了WHERE子句,因此减少了对输出行的估计。但是,扫描仍将必须访问所有10000行,因此成本并未降低。实际上,它已经增加了一点(确切地说是10000 * cpu_operator_cost)以反映检查WHERE条件所花费的额外CPU时间。