加快对嵌套在对象jsonb数组中的键值的范围测试

加快对嵌套在对象jsonb数组中的键值的范围测试,第1张

加快对嵌套在对象jsonb数组中的键值的范围测试

第一个直接措施是使查询速度更快:

SELECt *FROM   parents pWHERe  EXISTS (   SELECt FROM jsonb_array_elements(p.children) c   WHERe (c->>'age')::int BETWEEN 10 AND 12   );

EXISTS
当多个数组对象匹配时,半联接避免了中间表中行的重复-以及
DISTINCT ON
在外部查询中的需要。但这只是稍微快一点。

核心问题是您想测试 整数值范围
,而现有的

jsonb
运算符不提供此类功能。

有多种解决方法。不知道这些,这里有一个“智能”解决方案可以解决给定的示例。诀窍是将范围划分为不同的值,并使用

jsonb
container运算符
@>

SELECt *FROM   parents pWHERe (p.children @> '[{"age": 10}]'OR     p.children @> '[{"age": 11}]'OR     p.children @> '[{"age": 12}]');

jsonb_path_ops
GIN索引支持:

CREATE INDEX parents_children_gin_idx ON parents USING gin (children jsonb_path_ops);

但是,如果您的范围跨越了一个不完整的整数值,那么您将需要一些更通用的东西。与 往常一样
,最佳解决方案取决于整体情况:数据分布,值频率,查询中的典型范围,可能为NULL值,行大小,读/写模式, 每个

jsonb
值都具有一个或多个匹配
age
键吗?…



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5640440.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存