PostgreSQL:为什么这个简单的查询不使用索引?

时间:2011-02-04 22:43:59

标签: database postgresql relational-database database-performance

我有一个带有列c的表t,它是一个int并且有一个btree索引。

为什么以下查询不使用此索引?

explain select c from t group by c;

我得到的结果是:

HashAggregate  (cost=1005817.55..1005817.71 rows=16 width=4)
  ->  Seq Scan on t  (cost=0.00..946059.84 rows=23903084 width=4)

我对索引的理解是有限的,但我认为这些查询是索引的目的。

3 个答案:

答案 0 :(得分:6)

可以使用称为松散索引扫描的优化来执行此查询。但是PostgreSQL还没有实现这种优化,所以它使用了表扫描。

在主要数据库中,据我所知只有MySQL has implemented loose index scan(也许也是Oracle?)。 PostgreSQL hasn't实现了这一功能。

答案 1 :(得分:4)

查询当然可以使用索引。它不在您的特定情况下的原因取决于数据的特定大小和分布。您可以使用SET enable_seqscan TO off进行调查。

答案 2 :(得分:3)

因为它需要扫描整个表,所以通过索引这样做是没有好处的。 (由于其MVCC实现,“覆盖索引”在PostgreSQL中作为一种性能技术无用)。