Postgresql

獲取 Postgres 數據庫中的確切行數

  • February 27, 2018

有什麼方法可以快速獲取 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(*)他們推薦使用的頁面中進一步描述的 a pgstattuple_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

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