Postgresql
計算表中行數的最有效方法是什麼?
我正在使用帶有以下查詢的 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 的預設設置。)檢查死元組: