Postgresql

從 pg_class.reltuples 獲取給定條件的計數估計

  • February 21, 2022

是否可以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在範例中)是無關緊要的(除非您對索引有其他用途)。最好選擇一個永遠不會改變的小列:serialPK 列將是一個完美的候選人。或者您可以使用一個常量(這會破壞該索引的其他用途):

CREATE INDEX tbl_name_hello_idx ON tbl(**(1)**) WHERE name LIKE 'hello%';

每個索引都有自己的條目pg_class和自己的reltuples計數。文件:

reltuples

表中的行數。這只是規劃者使用的估計值。它由VACUUMANALYZE和一些 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);

看:

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