Postgresql
從 pg_class.reltuples 獲取給定條件的計數估計
是否可以
reltuples
使用附加條件查詢給定表的列table.name LIKE 'hello%'
?目前在我更大的表上,
SELECT count(*)
查詢需要很長時間,我不需要精確計數。所以我想知道是否可以在其中添加WHERE
子句reltuples
?
不是開箱即用。但是您可以通過…實現它
部分索引
CREATE INDEX tbl_name_hello_idx ON tbl(tbl_id) WHERE name LIKE 'hello%'; SELECT reltuples FROM pg_class WHERE oid = 'tbl_name_hello_idx'::regclass; -- or schema-qualify table name
實際的索引列(
tbl_id
在範例中)是無關緊要的(除非您對索引有其他用途)。最好選擇一個永遠不會改變的小列:serial
PK 列將是一個完美的候選人。或者您可以使用一個常量(這會破壞該索引的其他用途):CREATE INDEX tbl_name_hello_idx ON tbl(**(1)**) WHERE name LIKE 'hello%';
每個索引都有自己的條目
pg_class
和自己的reltuples
計數。文件:
reltuples
…表中的行數。這只是規劃者使用的估計值。它由
VACUUM
、ANALYZE
和一些 DDL 命令(例如CREATE INDEX
.因此,部分索引可以(ab-)用於獲取任何謂詞集的計數估計值,
autovacuum
自動更新。或者也許你已經有了索引,因為你仍然需要它?這實際上可能是一個非常聰明的想法。但是你必須權衡成本和收益:對於罕見的情況,部分指數很小,但對於常見的情況,成本會變大。雖然保持最新的統計數據相對便宜,但它不是免費的。
有關的:
TABLESAMPLE SYSTEM (n)
在 Postgres 9.5+你會喜歡即將發布的 Postgres 9.5 中的新功能,它只查看表中 n % 塊的隨機樣本來快速估計。1% 的範例:
SELECT 100 * count(*) AS estimate FROM tbl TABLESAMPLE SYSTEM (1) WHERE name LIKE 'hello%';
上面已經連結的答案中的詳細資訊:
給定範例的替代方案
對於給定的範例,無論如何您都可以使用正確的索引
name LIKE 'hello%'
獲得非常快速的準確結果:CREATE INDEX tbl_name_text_pattern_idx ON tbl(name text_pattern_ops);
看: