ldr*_*drg 12 postgresql optimization count
我在文档中看到了count(*)
和之间的区别count(pk)
。我一直在使用count(pk)
(哪里pk
是SERIAL PRIMARY KEY
)不知道count(*)
.
我的问题是关于 Postgres 的内部优化。是否足够聪明地发现 aSERIAL PRIMARY KEY
将存在于每一行中并且永远不会为假并且只计算行数,或者它是否会对每一行进行冗余谓词检查?我同意这可能是一个毫无意义的优化,但我只是好奇。
我看了看输出EXPLAIN
和EXPLAIN VERBOSE
为count(*)
,count(id)
并count(id > 50)
看看是否EXPLAIN
提到检查其输出的断言。它没有。
Erw*_*ter 15
我在我的各种版本在过去几年反复试验一致的结果:
count(*)
是略快于count(pk)
。它也更短,并且在大多数情况下它更适合测试的内容:行的存在。
关于:
Postgres 是否足够聪明以发现 a
SERIAL PRIMARY KEY
将存在于每一行中并且永远不会是假的
唯一相关的是NOT NULL
约束。的PRIMARY KEY
是NOT NULL
自动,serial
或never false
正交于问题。
使用count(col)
,如果PostgreSQL 试图变得聪明并检查系统目录是否有列NOT NULL
并回退到等效的count(*)
,那么与使用 相比,您仍然可以在系统表上进行更多的查找count(*)
。
至于EXPLAIN
输出,还有是一个暗示:
EXPLAIN SELECT count(*) FROM ...
Aggregate (cost=4963.38..4963.43 rows=1 width=0) ...
EXPLAIN SELECT count(pk) FROM ...
Aggregate (cost=4963.38..4963.43 rows=1 width=4) ...
Run Code Online (Sandbox Code Playgroud)
这意味着,count(col)
在不转换为count(*)
,即使它被定义NOT NULL
。