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