9

我有一个带有列 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)

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

4

3 回答 3

6

可以使用称为松散索引扫描的优化来执行此查询。然而 PostgreSQL 还没有实现这个优化,所以它使用表扫描来代替。

在主要数据库中,据我所知只有MySQL 实现了松散索引扫描(也许 Oracle 也是?)。PostgreSQL没有实现这个特性。

于 2011-02-04T23:21:51.047 回答
5

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

于 2011-02-06T20:31:20.447 回答
3

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

于 2011-02-04T22:52:49.287 回答