Postgresql

計算表中行數的最有效方法是什麼?

  • March 25, 2016

我正在使用帶有以下查詢的 Postgres:

select count(*) from image;

該表的主鍵是不遞增的;它是儲存在表中的圖像的唯一序列號。我們的應用程序經常嘗試攝取已經記錄在數據庫中的圖像,因此主鍵/序列號確保它們只記錄一次。

現在我們想知道我們是否應該使用遞增的主鍵來代替。我們在數據庫中有 1,259,369 張圖像,執行計數查詢大約需要 7 分鐘。

我們的應用程序永遠不會從該表中刪除圖像 - 因此遞增的主鍵將允許我們檢查最後一個 ID 的值,該值等於表中的行數。

通常,如果您不需要精確計數,有一種更快的方法:

SELECT reltuples::bigint AS estimate
FROM   pg_class
WHERE  oid = 'image'::regclass;

事實上,在具有並發寫入訪問權限的數據庫中,每個計數都是一個估計值,因為該數字可能在您得到它的那一刻就已經過時了。

但是,就像@a_horse 評論的那樣,您的數據庫中有一些東西。在最壞的情況下,數一百萬應該不會超過幾秒鐘。

app will never delete images from this table讓這更加可疑,因為那時不應該有很多死行。(或者你更新了很多?)大量的死元組可能會減慢你的速度 - 並要求VACUUM. 通常,autovacuum會處理這個問題。你啟用了嗎?(這是現代 Postgres 的預設設置。)

檢查死元組:

所有通常的性能優化建議都適用。

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