2016-04-28 41 views
1

我有一個腳本,每天運行好幾次,它記錄了幾個PostgreSQL表的行數。索引獲取只讀(不可變)PostgreSQL表的行數?

一些表雖然是隻讀的,並且從不改變。 (沒有行被添加或刪除,也沒有任何值被更改。)

有沒有一種方法可以快速從PostgreSQL獲取行數?例如。我可以在select count(*) from some_table;上創建索引嗎?

我不希望將其緩存在腳本中。如果我要緩存腳本,我還沒有找到一種可靠的方法來確定自上次腳本運行以來表是否發生了更改。

+0

多少時間你的計數腳本採取顯著快?最大的桌子有多少排?你使用的是哪個版本的PostgreSQL? –

+0

PostgreSQL版本9.4.4。 最大的桌子有大約200MM的排,計數需要10+分鐘。 – jastr

回答

2

不幸的是,在postgresql中SELECT COUNT(*)往往是slower than mysql,它通常與其進行比較。

您可以使用以下查詢作爲SELECT COUNT(*)的替代選項。

SELECT reltuples FROM pg_class WHERE relname = 'mytable'; 

這並不總是100%最新,但對於不可變表格,每次都是準確的。瞬間。對於非常大的表格,百分比誤差將非常小,因此非常值得大規模節省時間。

如果是物質和表不包含空值,你可以使用

SELECT COUNT(primary_key_column) FROM table 

,這將是比SELECT COUNT(*)

+0

這是一個相當不錯的答案;然而,腳本並不知道哪些表是不可變的,哪些不是。所以腳本不會知道何時運行reltuples或什麼時候需要計數。 另外,reltuples :: bigint在具有200MM行的不可變表上關閉了6行。 – jastr

+0

已更新的答案。 – e4c5

+0

順便說一句,2億的6中只有0.000003% – e4c5