首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有办法确保索引只扫描jsondoc->‘.’平等查询?

是否有办法确保索引只扫描jsondoc->‘.’平等查询?
EN

Stack Overflow用户
提问于 2018-12-02 18:23:14
回答 1查看 195关注 0票数 2

我设计了一个完整的应用程序,其思想是在jsonb中存储未处理的JSON文档,然后使用表单(jsondoc->>'fieldname')的字段访问表达式选择性地创建覆盖索引,以确保所有必需的查询都可以以索引扫描的形式执行。存储原始json的想法非常有吸引力,因为它删除了整个ETL (提取、转换、加载)层,而ETL层一直是bug和操作头疼的来源。

pgsql手册包含了一个非常不幸的事实:

原则上,仅索引扫描可以与表达式索引一起使用.例如,给定f(x)上的索引,其中x是表列,则应该可以执行

代码语言:javascript
复制
SELECT f(x) FROM tab WHERE f(x) < 1;

如果f()是一个昂贵的计算函数,这是非常有吸引力的。然而,PostgreSQL的计划器目前在这类情况下并不十分聪明。认为,只有当查询所需的所有列都可以从索引中获得时,才可能通过索引进行可执行的查询。在本例中,除上下文f(x)外,不需要x,但是规划者没有注意到,并得出结论,只进行索引扫描是不可能的。如果仅进行索引扫描似乎足够有价值,则可以通过声明索引为on (f(x),x)来解决这一问题,其中第二列在实践中不会被使用,而只是为了让计划者相信只进行索引扫描是可能的。如果目标是避免重新计算f(x),那么另一个警告是,规划者不一定会匹配f(x)在索引列的可索引WHERE子句中的用法。在上面所示的简单查询中,它通常会做到这一点,但在涉及联接的查询中则不会这样做。这些缺陷可能在未来版本的PostgreSQL中得到弥补。

我的问题非常明确:

如何在不复制索引中巨大的json有效负载的情况下,将“x”的解决方案应用于jsonb列?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-12 12:07:45

您可以将希望只进行索引扫描的字段提取到生成列中,并在生成的列上创建相应的覆盖索引。然后,查询规划器可以使用索引扫描。

假设您只需要对几个字段执行此操作,那么它应该比包含完整jsondoc列的索引高效得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53583257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档