Postgresql
Postgres:計數(*)與計數(id)
我在文件
count(*)
中看到和之間的區別count(pk)
。我一直在使用count(pk)
(wherepk
is aSERIAL PRIMARY KEY
) 不知道count(*)
.我的問題是關於 Postgres 的內部優化。是否足夠聰明地發現 a
SERIAL PRIMARY KEY
將存在於每一行中並且永遠不會是錯誤的並且只計算行數,或者它是否會對每一行進行冗餘謂詞檢查?我同意這可能是一個毫無意義的優化,但我只是好奇。我查看了
EXPLAIN
和EXPLAIN VERBOSE
for的輸出count(*)
,看看是否提到檢查其輸出中的謂詞。它沒有。count(id)``count(id > 50)``EXPLAIN
我在過去幾年對各種版本的反複測試中得到了一致的結果:略
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**) ...
意思是,即使定義了,
count(col)
也不會轉換為.count(*)``NOT NULL