PostgreSQL:COUNT(*)使用顺序扫描,而不是索引


Answers:


16

官方的wiki页面给出问题的答案:

[...]这很慢的原因与PostgreSQL中的MVCC实现有关。多个事务可以看到数据的不同状态这一事实意味着“ COUNT(*)”没有简单的方法可以汇总整个表中的数据;从某种意义上说,PostgreSQL必须遍历所有行。通常,这会导致顺序扫描读取有关表中每一行的信息。[...]

此外,您可以尝试进行ANALYZE重建查询计划器的信息。

使用时,您应该会获得更好的性能,COUNT(an uniquly indexed field)但是如果这很大,则执行seq扫描是唯一的方法。

如果您需要非常快速的数字并且不害怕查询架构,则可以执行以下操作

SELECT reltuples FROM pg_class WHERE oid = 'your_table'::regclass

但是不要依赖于此值,因为它只是表中元组的“估计”(尽管通常是准确的)数量。


我认为这是不正确的。我在任何地方都没有阅读任何东西,COUNT(pk)可以提高性能。我认为它将始终执行seq扫描
vol7ron 2011年

1
如果没有正确的where子句,将执行seq扫描。通过充分选择where子句,PostgreSQL可以使用索引,但是请记住,它将回到表以验证其所报告的元组的可见性。
Scott Marlowe

另一种获取估计行数的方法是,我发现它更容易记住EXPLAIN SELECT * from your_table;。这不会执行查询。输出包括rows=…估计的行数。
Sven Marnach
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.