28

如果 PostgreSQLcount(*)总是很慢,如何对复杂查询进行分页?

只要在这种情况下我们有很多页面(例如不同的类别、过滤器等),制作触发器似乎不是一个好的解决方案。

如果VACUUM/VACUUM ANALYZE/ANALYZE/VACUUM FULL没有帮助怎么办?count(*)使用postgresql的最佳实践是什么?

4

2 回答 2

19

你读过那篇文章的标题吗?

请注意,以下文章仅适用于 9.2 之前的 PostgreSQL 版本。现在实现了仅索引扫描。

使用 9.2,你通常会发现你得到了更好的结果。阅读仅索引扫描 wiki 页面了解详细信息。

也就是说,在旧版本上使用LIMIT并且OFFSET通常可以正常工作。如果您不介意一些变化,您可以使用表统计信息来估计行数(以及因此页数)。请参阅您已链接到的文章中的“估计行数” 。

LIMIT无论如何,使用and进行分页OFFSET是一种反模式。很多时候你可以改写你的分页代码以便它使用sort_column > 'last_seen_value' LIMIT 100,即它避免了偏移。这有时会导致非常大的性能提升。

于 2013-06-04T11:41:17.907 回答
14

如果您正在执行 SELECT count(*) FROM table 并启用了 pg stats,则可以使用下面的示例,在这种情况下从 13ms 下降到 0.05ms。

SELECT count(*) FROM news;

26171

EXPLAIN ANALYZE SELECT count(*) FROM news;

总运行时间:13.057 毫秒

SELECT reltuples::bigint AS count FROM pg_class WHERE oid = 'public.news'::regclass;

26171

EXPLAIN ANALYZE SELECT reltuples::bigint AS count FROM pg_class WHERE oid = 'public.news'::regclass;

总运行时间:0.053 毫秒

于 2013-12-13T19:04:07.007 回答