Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres 9.6-jsonb?运算符缺少索引,但存在?操作人员_Postgresql_Indexing_Jsonb_Postgresql 9.6 - Fatal编程技术网

Postgresql Postgres 9.6-jsonb?运算符缺少索引,但存在?操作人员

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 *

我在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 * 
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中,它可能会有更好的估计,因此可能会提出比意外情况下更可靠的计划