SELECT unique,摆脱位图堆扫描

问题描述 投票:0回答:2

给定表格

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 进行过滤,然后执行 Bitmap Heap Scan 来获取 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)

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

postgresql query-optimization database-performance
2个回答
3
投票

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

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

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


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.