Postgresql

Postgres:計數(*)與計數(id)

  • June 26, 2018

我在文件count(*)中看到和之間的區別count(pk)。我一直在使用count(pk)(where pkis a SERIAL PRIMARY KEY) 不知道count(*).

我的問題是關於 Postgres 的內部優化。是否足夠聰明地發現 aSERIAL PRIMARY KEY將存在於每一行中並且永遠不會是錯誤的並且只計算行數,或者它是否會對每一行進行冗餘謂詞檢查?我同意這可能是一個毫無意義的優化,但我只是好奇。

我查看了EXPLAINEXPLAIN VERBOSEfor的輸出count(*),看看是否提到檢查其輸出中的謂詞。它沒有。count(id)``count(id > 50)``EXPLAIN

我在過去幾年對各種版本的反複測試中得到了一致的結果:

count(*)快於. 它也更短,並且大多數時候它更適合測試的內容:一行的存在。count(pk)

關於:

Postgres 是否足夠聰明,可以發現 aSERIAL PRIMARY KEY將存在於每一行中並且永遠不會是錯誤的

唯一相關的是NOT NULL約束。PRIMARY KEYNOT 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

引用自:https://dba.stackexchange.com/questions/41090