我有一个带有列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)
我对索引的理解是有限的,但我认为这些查询是索引的目的。
答案 0 :(得分:6)
可以使用称为松散索引扫描的优化来执行此查询。但是PostgreSQL还没有实现这种优化,所以它使用了表扫描。
在主要数据库中,据我所知只有MySQL has implemented loose index scan(也许也是Oracle?)。 PostgreSQL hasn't实现了这一功能。
答案 1 :(得分:4)
查询当然可以使用索引。它不在您的特定情况下的原因取决于数据的特定大小和分布。您可以使用SET enable_seqscan TO off
进行调查。
答案 2 :(得分:3)
因为它需要扫描整个表,所以通过索引这样做是没有好处的。 (由于其MVCC实现,“覆盖索引”在PostgreSQL中作为一种性能技术无用)。