选择不同,摆脱位图堆扫描

时间:2011-03-18 09:16:23

标签: postgresql query-optimization

给出表格

create table a (x int, y int);
create index a_x_y on a(x, y);

我希望像select distinct x from a where y = 1之类的查询只使用索引,而是使用索引按y进行过滤,然后执行位图堆扫描以获取x的所有值。

---------------------------------------------------------------------------------------------------------------------
 HashAggregate  (cost=15.03..15.05 rows=2 width=4) (actual time=0.131..0.131 rows=0 loops=1)
   ->  Bitmap Heap Scan on a  (cost=4.34..15.01 rows=11 width=4) (actual time=0.129..0.129 rows=0 loops=1)
         Recheck Cond: (y = 1)
         ->  Bitmap Index Scan on a_x_y  (cost=0.00..4.33 rows=11 width=0) (actual time=0.125..0.125 rows=0 loops=1)
               Index Cond: (y = 1)

此类查询需要什么样的索引?

2 个答案:

答案 0 :(得分:3)

由于您要对索引的第二列进行过滤,因此不会将其用于直接索引扫描。如果您将索引更改为y,x而不是x,y,则可能会为您提供所需的扫描。

另外,如果您将实际数据放在表格中,您可能会得到不同的查询计划,因此您应该使用实际数据进行测试。

最后,我认为你误解了位图扫描节点。位图堆扫描并不意味着它正在进行实际的堆扫描。它使用索引来找出哪些页面上有感兴趣的行,然后将在第二个操作中仅在表中扫描这些页面。

答案 1 :(得分:1)

位图堆扫描需要0.129毫秒,还不够快吗?

如果您正在考虑“仅索引扫描”,PostgreSQL还不能这样做。

相关问题