獲取 Postgres 數據庫中的確切行數
有什麼方法可以快速獲取 Postgres 中所有表的確切行數?
Count(*)
對於較大的表,似乎執行非常緩慢。有沒有辦法從 Postgres 統計表中獲得準確的計數而無需執行 Vacuum,這也是一項昂貴的操作?
似乎目前沒有內置方法可以在 PostgreSQL 中執行您需要的操作。
人們正在努力實現這種能力。雖然沒有人可以肯定地說這些功能何時會成為 PostgreSQL 版本,但我認為可以肯定地預測它不會在 2017 年末之前出現,而且很可能會更晚。
同時,您可以使用觸發器手動實現解決方案;例如,如A. Elein Musttain在Postgresql General Bits中所述。
這個想法是使用觸發器在單獨的表中維護始終最新的行數。請注意,這可能會增加數據修改的大量成本。
您可能需要考慮使用內置函式**pgstattuple**,其文件如下:
pgstattuple 模組提供了各種函式來獲取元組級別的統計資訊。
參考: pgstattuple(PostgreSQL 文件)
然後,您只需啟動如下命令:
SELECT * FROM pgstattuple('<schema_name>.<table_name>');
…它會返回與此類似的內容:
-[ RECORD 1 ]------+------- table_len | 458752 tuple_count | 1470 tuple_len | 438896 tuple_percent | 95.67 dead_tuple_count | 11 dead_tuple_len | 3157 dead_tuple_percent | 0.69 free_space | 8932 free_percent | 1.95
這類似於使用
SElECT count(*)
他們推薦使用的頁面中進一步描述的 apgstattuple_approx(regclass)
:pgstattuple_approx 是 pgstattuple 的一種更快的替代方法,它返回近似結果
對可能差異的解釋被記錄為:
pgstattuple 總是執行全表掃描並返回準確的活動和死元組計數(及其大小)和可用空間,而 pgstattuple_approx 試圖避免全表掃描並返回準確的死元組統計資訊以及數量的近似值以及活動元組的大小和可用空間。
它通過根據可見性映射跳過僅具有可見元組的頁面來做到這一點(如果頁面設置了相應的 VM 位,則假定它不包含死元組)。對於這樣的頁面,它從空閒空間映射中導出空閒空間值,並假設頁面上的其餘空間被活動元組佔用。
對於不能跳過的頁面,它會掃描每個元組,在適當的計數器中記錄它的存在和大小,並將頁面上的可用空間相加。最後,它根據掃描的頁數和元組數估計活動元組的總數(與 VACUUM 估計 pg_class.reltuples 的方式相同)。
可能的例子:
SELECT * FROM pgstattuple_approx('<schema_name>.<table_name>::regclass);
可能的結果:
-[ RECORD 1 ]--------+------- table_len | 573440 scanned_percent | 2 approx_tuple_count | 2740 approx_tuple_len | 561210 approx_tuple_percent | 97.87 dead_tuple_count | 0 dead_tuple_len | 0 dead_tuple_percent | 0 approx_free_space | 11996 approx_free_percent | 2.09