给定表格
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)
此类查询需要什么样的索引?
由于您要过滤索引的第二列,因此它不会用于直接索引扫描。如果您将索引更改为 y,x 而不是 x,y,它可能会为您提供所需的扫描。
此外,如果您将实际数据放入表中,您很可能会得到不同的查询计划,因此您应该使用实际数据进行测试。
最后,我认为您误解了位图扫描节点。位图堆扫描并不意味着它正在进行实际的堆扫描。它使用索引来找出哪些页面上有有趣的行,然后在第二个操作中仅扫描表中的这些页面。
位图堆扫描需要0.129毫秒,这还不够快吗?
如果您正在考虑“仅索引扫描”,PostgreSQL 还不能做到这一点。