为什么COUNT(*)
在有一个很小的索引主键的情况下PostgreSQL顺序扫描表以进行查询?
为什么COUNT(*)
在有一个很小的索引主键的情况下PostgreSQL顺序扫描表以进行查询?
Answers:
在官方的wiki页面给出问题的答案:
[...]这很慢的原因与PostgreSQL中的MVCC实现有关。多个事务可以看到数据的不同状态这一事实意味着“ COUNT(*)”没有简单的方法可以汇总整个表中的数据;从某种意义上说,PostgreSQL必须遍历所有行。通常,这会导致顺序扫描读取有关表中每一行的信息。[...]
此外,您可以尝试进行ANALYZE重建查询计划器的信息。
使用时,您应该会获得更好的性能,COUNT(an uniquly indexed field)
但是如果这很大,则执行seq扫描是唯一的方法。
如果您需要非常快速的数字并且不害怕查询架构,则可以执行以下操作
SELECT reltuples FROM pg_class WHERE oid = 'your_table'::regclass
但是不要依赖于此值,因为它只是表中元组的“估计”(尽管通常是准确的)数量。
EXPLAIN SELECT * from your_table;
。这不会执行查询。输出包括rows=…
估计的行数。
COUNT(pk)
可以提高性能。我认为它将始终执行seq扫描