索引 jsonb 以进行字段的数字比较

2023-11-30

我定义了一个简单的表

create table resources (id serial primary key, fields jsonb);

它包含带有键(从一个大集合中提取)和 1 到 100 之间的值的数据,例如:

   id   |    fields                                                                                                 
--------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      1 | {"tex": 23, "blair": 46, "cubic": 50, "raider": 57, "retard": 53, "hoariest": 78, "suturing": 25, "apostolic": 22, "unloosing": 37, "flagellated": 85}
      2 | {"egoist": 75, "poshest": 0, "annually": 19, "baptists": 29, "bicepses": 10, "eugenics": 9, "idolizes": 8, "spengler": 60, "scuppering": 13, "cliffhangers": 37}
      3 | {"entails": 27, "hideout": 22, "horsing": 98, "abortions": 88, "microsoft": 37, "spectrums": 26, "dilettante": 52, "ringmaster": 84, "floweriness": 72, "vivekananda": 24}
      4 | {"wraps": 6, "polled": 68, "coccyges": 63, "internes": 93, "unburden": 61, "aggregate": 76, "cavernous": 98, "stylizing": 65, "vamoosing": 35, "unoriginal": 40}
      5 | {"villon": 95, "monthly": 68, "puccini": 30, "samsung": 81, "branched": 33, "congeals": 6, "shriller": 47, "terracing": 27, "patriarchal": 86, "compassionately": 94}

我想搜索其值(与特定键相关)大于某个基准值的条目。我可以通过以下方式完成此任务:

with exploded as (
    select id, (jsonb_each_text(fields)).*
    from resources)
select distinct id
    from exploded
    where key='polled' and value::integer>50;

...但是当然这不使用索引,而是诉诸于表扫描。我想知道是否有:

  1. 查询“polled”>50 的资源的更有效方法
  2. 一种构建支持此类查询的索引的方法

你还没有具体说明是哪一种INDEX你期望被使用,但你还没有提供它的定义。

典型的INDEX for a jsonb字段将是GIN一,但在您的具体情况下,您实际上需要compare中包含的一些值polled key.

Maybe一个具体的INDEX(虽然不是一个GIN一个!)与一个表达可能有一定用处,但我对此表示怀疑,并且它可能会变得相当麻烦,因为您至少需要双精度类型转换才能获得整数值和自定义值IMMUTABLE函数来实际执行类型转换CREATE INDEX陈述。

在采取复杂的路线之前,该路线只能解决一些特定情况(如果您需要与不同的路线进行另一次比较怎么办)fields键?),您可以尝试利用 PostgreSQL 9.4 新功能来优化当前查询LATERAL能力和jsonb处理功能。 结果是查询的运行速度应比当前查询快 8 倍:

SELECT r.id 
    FROM resources AS r,
    LATERAL jsonb_to_record(r.fields) AS l(polled integer) 
    WHERE l.polled > 50;



EDIT :

我做了一个快速测试,将我的评论中的想法付诸实践,以使用GIN INDEX在实际比较值之前限制行数,事实证明您确实可以使用GIN INDEX即使在那种情况下。

The INDEX必须使用默认运算符类创建jsonb_ops (not更轻、性能更强jsonb_path_ops) :

CREATE INDEX ON resources USING GIN (fields);

现在您可以利用索引,只需包含一个存在?在查询中测试:

SELECT r.id
    FROM resources AS r,
    LATERAL jsonb_to_record(r.fields) AS l(polled integer) 
    WHERE r.fields ? 'polled' AND l.polled > 50;

现在查询执行大约快 3 倍 (比第一个 CTE 版本快约 20 倍)。我已经测试了多达 1M 行,性能增益始终相同。


请记住,正如预期的那样,行数起着重要作用:行数少于 1K 时,索引毫无用处,查询规划器可能不会使用它。

也不要忘记jsonb_ops与实际数据相比,索引可能会变得巨大。对于像您这样的数据样本,范围从 1K 到 1M 行,索引本身大约是170%比表中实际数据大,自己查一下:

SELECT pg_size_pretty(pg_total_relation_size('resources')) AS whole_table, 
       pg_size_pretty(pg_relation_size('resources')) AS data_only, 
       pg_size_pretty(pg_relation_size('resources_fields_idx')) AS gin_index_only;

只是为了给您一个想法,像您的数据示例一样,该表大约有 300K 行,该表大约有 250MB,其中包含 90MB 数据和 160MB 索引! 就我个人而言,我会坚持(我确实这样做)用一个简单的LATERAL JOIN没有索引。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

索引 jsonb 以进行字段的数字比较 的相关文章

  • 微服务中的关系型数据库

    我有一个整体应用程序 当前使用 PostgreSQL 数据库 并且模式的设置与您对大多数关系数据库的期望相同 其中各种表数据通过 FK 链接回用户user id 我正在尝试了解有关微服务的更多信息 正在尝试将我的 python API 迁移
  • kubernetes 如何将 pod 暴露给集群机器之外的东西?

    我读了以下内容Kubernetes 文档 https kubernetes io docs tutorials kubernetes basics expose expose intro 这导致以下 yaml 在集群中运行 postgres
  • 多人/单人测验游戏的数据库设计

    我在这里看到了很多问题 但没有人适合我的问题 我正在尝试创建一个可扩展的 ER 模型 如果我想添加更多数据 则不会破坏几乎任何东西 所以我尝试创建的是 有两种类型的用户 比如说管理员和工作人员 他们有不同的角色 管理员可以对问题进行 CRU
  • 将表从 postgres 数据库同步/导入到 elasticsearch 的正确方法是什么?

    我想将 postgres 数据库中的一些表导入到 Elastic search 中 并使这些表与 elastic search 中的数据保持同步 我看过 udemy 上的课程 还与一位对此问题有丰富经验的同事进行了交谈 以了解最好的方法是什
  • 无法在 postgres insert 中插入问号

    我正在尝试运行一个简单的 Postgres SQL 插入 insert into Resources values 1 How are you 但插入后的结果是 ID Data 1 How are you 1 我知道 要插入单引号等字符 我
  • 完整日历 - 向事件对象添加额外属性

    可能是由于我缺乏理解 但我使用 PHP 返回 JSON 字符串来带回事件数据
  • 我截断了一个表。我如何取回数据?

    在我的 postgresql 数据库中 不幸的是我截断了表mail group 并且该表已从数据库中删除 如何找回该表 请帮助我 等待回复 Thanks 其他有同样情况的人 立即地停止你的数据库pg ctl stop m immediate
  • 在redis中存储多个嵌套对象

    我想在redis中存储多个复杂的json数据 但不知道如何 这是我的 json 结构 users user01 username ally email email protected cdn cgi l email protection u
  • 第一次如何配置postgresql?

    我刚刚安装了 postgresql 并在安装过程中指定了密码 x 当我尝试做的时候createdb并指定我收到消息的任何密码 createdb 无法连接到数据库 postgres 致命 用户密码身份验证失败 同样适用于createuser
  • 与 Jackson 一起从 ASP.NET 反序列化日期

    我有一个 json 字符串 从 ASP NET Rest 服务返回 中的日期 如下所示 created Date 1277931782420 0700 杰克逊无法解析该日期 我可以编写自己的日期格式并将其传递给mapper getDeser
  • 如何使用Gson将JSONArray转换为List?

    在我的 Android 项目中 我试图将收到的 JSONArray 转换为列表 在 的帮助下这个答案 https stackoverflow com questions 8371274 how to parse json array in
  • 如何在 laravel 中查询 json 列?

    我用的是 Laravel 5 6 我有一块田地 字段的数据类型为json 字段 desc 字段 的值如下所示 code 1 club CHE country ENGLAND code 2 club BAY country GERMANY c
  • 如何在 ECMAScript 6 中导入 JSON 文件?

    如何访问 ECMAScript 6 中的 JSON 文件 以下不起作用 import config from config json 如果我尝试导入 JavaScript 文件 这可以正常工作 https www stefanjudis c
  • Sails.js + Postgres:交易问题

    我试图使用 Postgres 作为数据库在 Sails 0 10 5 中实现事务 但操作最终没有提交 或回滚 这是我作为测试写下的一个简单的事务场景 使用 async js testTransaction function uri var
  • 如何从 mysql 数据库中提取数据并使用 D3.JS 进行可视化?

    我有一个数据库MySQL我想在其中可视化D3 JS 为了做到这一点 首先我想parse中的数据JSON格式 然后编写一个基本代码 从数据库中提取数据并使用D3 JS 我环顾四周 但找不到我想要的东西 因为我是新手D3 JS 我怎样才能做到这
  • 限制相同的数据条目

    我是 SQL 新手 我有两张桌子 一张放冰箱 一张放食物 一台冰箱只能存放 5 种食物 所以我想知道是否有办法限制食物表中只有 5 个相同的冰箱 ID 条目 没有直接的方法来强制执行这样的约束 我能想到的最好的是 有一个 冗余 列food
  • 在 iPhone/iPod 上保存和编辑 JSON

    在 iPhone iPod 上编辑和保存 JSON 文件的最佳方法是什么 我知道有一些库可以让您轻松读取 JSON 数据 但是有没有可以让您生成它的库 TouchJSON http code google com p touchcode w
  • Express 不断将 request.body 获取为未定义的 JSON 对象

    我正在发出一个 Ajax 请求 如下所示 ajax url gen type POST data JSON stringify one 1 two 2 success function data console log this 我的快递部
  • Node.js 中的 JSON Zip 响应

    我对 node js 还很陌生 我正在尝试发回包含 JSON 结果的 zip 文件 我一直在尝试弄清楚如何去做 但还没有达到预期的结果 我正在使用 NodeJS ExpressJS LocomotiveJS Mongoose 和 Mongo
  • 如果是数字,Chrome 会重新排序对象键,这是正常/预期的吗

    我注意到某些评估电子商务网站的某些鞋码并将其输出到屏幕上的代码会打乱 Chrome 中的顺序 给出的 JSON 可以是 7 9149 9139 10455 17208 7 5 9140 9150 10456 17209 8 2684 914

随机推荐

  • Emacs:停止 gpg 密码的弹出窗口 [关闭]

    Closed 这个问题是无关 目前不接受答案 每当我打开加密文件 somefile gpg authinfo gpg 时 emacs 都会烦人地弹出窗口并要求输入密码 我希望它在迷你缓冲区中询问我密码 是否有任何配置选项 编辑 需要注意的是
  • 为 TRichEditViewer 导入外部 RTF 文件?

    我在用着TRichEditViewer在 Inno Setup 脚本的自定义页面上 是否可以将外部 RTF 文件读入变量 并使用该变量作为查看器的内容 或者我必须在脚本中保留实际的 RTF 代码吗 非常感谢任何帮助 你应该能够使用LoadS
  • python正则表达式重复组匹配[重复]

    这个问题在这里已经有答案了 可能的重复 Python 正则表达式 如何从通配符表达式中捕获多个组 我无法访问以下正则表达式中第三个或第五个元素的组 gt gt gt x f 167 2958 335 3103 0 gt gt gt re s
  • java阅读器与流

    我正在阅读有关 Java I O 的内容 发现了一些有趣的领域 例如流 读取器等 InputStream input new FileInputStream input file txt int data input read while
  • 如何检查我的机器上是否安装了 IPython 以及安装这些库的顺序是什么?

    我需要使用 python 进行机器学习课程 并且还需要安装一些外部库 我对安装所有东西的正确顺序有点困惑 因为我听说如果做得不正确 路径可能会变得混乱 这是我需要的 Python 版本 2 7 IPython enthought 这个包中可
  • Scala 占位符语法

    有件事不太明白希望有人能解释一下 我有 Seq 字符串 val strDeps Seq String 我尝试使用 sortWith 方法对其进行相反的排序 但出现以下错误 scala gt print strDeps sortWith re
  • 如何重用android警报对话框

    我想重用alertDialog的代码并将其作为函数调用放在另一个java文件中 但是 this 不能用来替换 MyActivity this 吗 如何将其作为参数传递 如果代码是通用的 那就最好了 AlertDialog alertDial
  • 使用 Pandas DataFrame 中其他两列的键和值创建字典列

    我目前有一个 Pandas DataFrame 其中有两列 每列都包含列表 另一列包含这两个列表的元素的元组对 为了方便起见 一个玩具示例如下 col1 col2 col3 col4 0 a 0 1 8 9 0 8 1 9 1 b 2 3
  • CurrentThread/ProcessThread 对象

    在 NET BCL中 有一个CurrentThread和一个ProcessThread对象 这些有什么区别呢 Thanks 这是设计 NET 2 0 时 SQL Server 项目的遗留问题 他们向 CLR 团队施压really很难打破 N
  • Android - 将资产复制到内部存储

    再会 我刚刚开始开发android 在我的应用程序中 我需要将资产文件夹中的项目复制到内部存储中 我在 SO 上搜索了很多 包括将其复制到外部存储的方法 如何将文件从 assets 文件夹复制到SD卡 这就是我想要实现的目标 我的内部存储中
  • 火星日食模糊

    使用 Eclipse Luna 几年后 我决定迁移到火星 我注意到当我用水平卷轴向右移动时它变得模糊 我正在笔记本电脑 Compaq 6710b 上使用 Ubuntu 14 04 有人可以帮我解决这个问题吗 这可能是由于月球上的 GTK 2
  • PHP DateTime 时区 - 构造函数与 Setter 方法

    使用 PHP 时DateTime类并尝试设置一个DateTimeZone根据我的设置方式 我得到不同的结果 使用DateTime construct或使用DateTime setTimezone method 这是一个例子 date 201
  • 属性映射未正确关联。为什么?

    EDIT 1虽然我知道对于这个特定的场景 以及其他类似的情况 我可以单独使用映射编辑器来正确迁移我的存储 以便持久存储中的值不会跳来跳去 但这并不是我当前问题的解决方案 而只是回避解决问题的根源 我热衷于坚持我的自定义迁移策略 因为这将使我
  • cx_Freeze 和 pyinstaller 出现导入错误

    我之前使用 pyinstaller 尝试将我的应用程序扭曲为可执行文件 但在执行时出现此错误 Traceback most recent call last File usr local lib python2 7 dist package
  • 我怎样才能做到颤振自动对焦但键盘关闭

    每当页面打开时 我希望出现光标 但我不需要键盘 有谁知道我该怎么做 TextField textCapitalization TextCapitalization sentences controller textEditingContro
  • 如何将 URL 编码为“可浏览”?

    我想知道是否有任何方法可以解析这样的 URL https www mysite com lot of unpleasant folders and my url with spaces others xls into https www m
  • 如何在 jquery ajax 的后期数据处理过程中设置加载图像?

    jquery ajax代码是 id btnpolls click function var valCheckedRadio input name data distributions checked val alert valChecked
  • 为什么从 main() 显式返回 0 被认为是好的做法? [复制]

    这个问题在这里已经有答案了 可能的重复 main 中的 return 语句与 exit 我刚刚读完第一章加速C 看起来是一本很棒的书 最后作者说 然而 明确地包含从 main 的返回是一个很好的做法 为什么这被认为是良好实践 在C99中 我
  • iOS 存档时未找到 Phonegap CDVViewController.h 文件

    我目前正在使用 Phonegap 2 0 在 XCode 中开发 iOS 应用程序 该应用程序在模拟器和测试设备上构建并运行良好 当我尝试存档应用程序以进行分发时 会出现问题 存档失败并显示以下消息 找不到 CDVViewControlle
  • 索引 jsonb 以进行字段的数字比较

    我定义了一个简单的表 create table resources id serial primary key fields jsonb 它包含带有键 从一个大集合中提取 和 1 到 100 之间的值的数据 例如 id fields