Postgresql Postgres 9.6-jsonb?运算符缺少索引,但存在?操作人员
我在postgres 9,6中进行了一些查询,涉及一个jsonb列、一个int列、两个索引(每列一个)和Postgresql Postgres 9.6-jsonb?运算符缺少索引,但存在?操作人员,postgresql,indexing,jsonb,postgresql-9.6,Postgresql,Indexing,Jsonb,Postgresql 9.6,我在postgres 9,6中进行了一些查询,涉及一个jsonb列、一个int列、两个索引(每列一个)和?|操作符。查询的jsonb部分很好地使用了它的索引,但int列没有 奇怪的是,当将?条件拆分为多个或?条件时,这两个索引都按预期工作 以下是我工作的细节 整数索引 创建修订版索引团队id(团队id) jsonb索引 使用gin(\u group\u ids jsonb\u ops)在修订版上创建索引\u group\u id\u gin\u索引 半工作?|查询 select *
?|
操作符。查询的jsonb部分很好地使用了它的索引,但int列没有
奇怪的是,当将?
条件拆分为多个或?
条件时,这两个索引都按预期工作
以下是我工作的细节
- 整数索引
创建修订版索引团队id(团队id)代码>
- jsonb索引
使用gin(\u group\u ids jsonb\u ops)在修订版上创建索引\u group\u id\u gin\u索引代码>
?|
查询
select *
from revisions
where team_id = 1
and _group_ids ?| '{"0","91"}';
select *
from revisions
where team_id = 1
and (_group_ids ? '0' or _group_ids ? '91');
修订时位图堆扫描(成本=224.42..2214.66行=92宽度=992)(实际时间=7.783..40.178行=4454循环=1)
重新检查条件:(_组_id?|'{0,91}'::text[])
筛选器:(团队id=1)
被筛选器删除的行:63027
堆块:精确=5129
->在组ID上的位图索引扫描(成本=0.00..224.40行=587宽度=0)(实际时间=7.086..7.086行=67481循环=1)
索引条件:(_组_id?|'{0,91}'::text[])
计划时间:0.142毫秒
执行时间:40.401毫秒
完全工作?
查询
select *
from revisions
where team_id = 1
and _group_ids ?| '{"0","91"}';
select *
from revisions
where team_id = 1
and (_group_ids ? '0' or _group_ids ? '91');
修订时位图堆扫描(成本=2414.55..3091.44行=184宽度=992)(实际时间=12.965..16.162行=4454循环=1)
重新检查条件:(((组id?'0'::文本)或((组id?'91'::文本))和(团队id=1))
堆块:精确=818
->位图与(成本=2414.55..2414.55行=184宽度=0)(实际时间=12.844..12.844行=0循环=1)
->BitmapOr(成本=424.89..424.89行=1173宽度=0)(实际时间=7.329..7.329行=0循环=1)
->在组ID gin索引上进行位图索引扫描(成本=0.00..212.40行=587宽度=0)(实际时间=6.439..6.439行=67076循环=1)
索引条件:(\u组\u ID?'0'::文本)
->在组ID上的位图索引扫描(成本=0.00..212.40行=587宽度=0)(实际时间=0.887..0.887行=405循环=1)
索引条件:(\u组\u ID?'91'::文本)
->团队id索引上的位图索引扫描(成本=0.00..1989.36行=91858宽度=0)(实际时间=5.218..5.218行=90229循环=1)
索引条件:(团队id=1)
计划时间:0.154毫秒
执行时间:16.540毫秒
如果我只需要用
?
而不是?|
重写我所有的查询,这没什么大不了的,但是为什么要这样做的秘密让我发疯。请帮助我保持理智 计划不同,因为估计不同。?|
的选择性是在不查看RHS上的列表有多长的情况下进行估计的,而或规划会隐式地考虑到这一点
位图索引在组ID gin索引上扫描。。。行=587
比特映射器。。。行=1173
您认为位图开始时越小,通过扫描单独的索引以添加到BitmapAnd中来尝试将其变小的意义就越小
自9.6以来,这一领域的规划没有得到改进,除了按照您已经指出的那样重写查询之外,您没有很多好的选择
请注意,在这两种情况下,估计值都相差很远,只是其中一种偏离的方式会意外地导致更好的计划。如果您使用本机数组,而不是将它们封装在JSONB中,它可能会有更好的估计,因此可能会比意外情况下更可靠地提出更好的计划。计划不同,因为估计不同。?|
的选择性是在不查看RHS上的列表有多长的情况下进行估计的,而或规划会隐式地考虑到这一点
位图索引在组ID gin索引上扫描。。。行=587
比特映射器。。。行=1173
您认为位图开始时越小,通过扫描单独的索引以添加到BitmapAnd中来尝试将其变小的意义就越小
自9.6以来,这一领域的规划没有得到改进,除了按照您已经指出的那样重写查询之外,您没有很多好的选择
请注意,在这两种情况下,估计值都相差很远,只是其中一种偏离的方式会意外地导致更好的计划。如果您使用本机数组而不是将它们封装在JSONB中,它可能会有更好的估计,因此可能会提出比意外情况下更可靠的计划