您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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

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

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

核心问题是您想测试 整数值范围 ,而现有的jsonb运算符不提供此类功能

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

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

jsonb_path_opsGIN索引支持

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

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

其他 2022/1/1 18:52:13 有457人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶