整个表的快速估算
对于整个表格的快速估算:
您的示例暗示了地址。假设我们在架构 public 中有一个名为 adr 的表:
SELECT reltuples FROM pg_class WHERE oid = 'public.adr'::regclass;
此相关答案中的更多详细信息:
How do I speed up counting rows in a PostgreSQL table?
按条件计数
对于有条件的计数,Postgres 可以使用 indexes 使其更快。这在 Postgres 9.2 中通过“覆盖索引”得到了改进,但必须满足某些要求才能从中获利。更多内容请关注Postgres Wiki about Index-only scans。
对于具有city 和state 条件的查询,如果条件是选择性(只有一小部分行满足条件),这个多列索引会很有帮助:
CREATE INDEX adr_foo_idx ON adr (city, state);
如果您有一组典型条件,您甚至可以使用partial indexes:
CREATE INDEX adr_ny_ny_idx ON adr(adr_id)
WHERE city = 'New York'
AND state = 'NY';
...每组(state, city)一个
或两者兼而有之:
CREATE INDEX adr_ny_idx ON adr (city)
WHERE state = 'NY';
...每个state一个
标准化
当然,使您的大表(和索引)更小的一切都会有所帮助。城市和城市的查找表将大大减少冗余存储。这里的关键词是normalization。
代替:
CREATE TABLE adr (
adr_id serial PRIMARY KEY
,state text
,city text
...
);
SELECT count(*)
FROM adr
WHERE city = 'New York'
AND state = 'NY';
规范您的数据库设计并使用适当的索引:
CREATE TABLE state (
state_id serial PRIMARY KEY
,state text UNIQUE
);
CREATE TABLE city (
city_id serial PRIMARY KEY
,state_id int REFERENCES state
,city text
,UNIQUE (state_id, city)
);
CREATE TABLE adr (
adr_id serial PRIMARY KEY
city_id int REFERENCES city
...
);
CREATE INDEX adr_city_idx ON adr (city_id);
SELECT count(*)
FROM state s
JOIN city c USING (state_id)
JOIN adr a USING (city_id)
WHERE s.state = 'NY'
AND c.city = 'New York'
表和索引变小。整数处理比文本更快。一切都变得更快了。
最重要的是,如果性能至关重要,并且由于您不需要精确计数,您可以使用具有相关条件计数的物化视图。在您选择的事件或时间刷新视图以使数字保持最新。请按照手册的链接了解详细信息。需要 Postgres 9.3,但您可以轻松地在任何版本中手动实现它。