查询 json / jsonb 列超级慢。我可以使用索引吗?

2024-02-01

我正在尝试加快对 PostgreSQL 数据库中存储的一些 json 数据的查询速度。我继承了一个查询 PostgreSQL 表的应用程序,名为data有一个名为value其中 value 是 json 类型的 blobjsonb.

它大约有 300 行,但需要 12 秒才能从 5 个 json 元素中选择此数据。 json blob 有点大,但我需要的数据都在 json 嵌套的顶层(如果有帮助的话)。

我尝试添加索引CREATE INDEX idx_tbl_data ON data USING gin (value);但这没有帮助。我应该使用不同的索引吗?长期愿景是重写应用程序以将数据移出 json,但由于应用程序其他部分的复杂性,这至少需要 30-40 个工作日的工作,所以我想看看是否可以可以在短期内加快速度。

不确定它是否有帮助,但构成此结果集的基础数据不会经常更改。经常发生变化的是 json blob 中更下方的数据。

SELECT
  value::json ->> 'name' AS name,
  value::json ->> 'mnemonic' AS mnemonic,
  value::json ->> 'urlName' AS "urlName",
  value::json ->> 'countryCode' AS "countryCode",
  value::json #>>'{team}' AS team
FROM
  data;

就像一匹马已经建议的那样(并且你提到了你自己),正确修复就是将这些属性提取到单独的列中,在一定程度上规范化您的设计。

索引有帮助吗?

Sadly, no(从 Postgres 14 开始)。

It could理论上工作。既然你的价值观是big,即使在检索所有行时(否则它会忽略索引),Postgres 也可以在仅索引扫描中拾取仅包含一些小属性的表达式索引。

手册: https://www.postgresql.org/docs/current/indexes-index-only-scans.html

然而,PostgreSQL 的规划器目前对于此类情况还不是很聪明。仅当查询所需的所有列均可从索引中获取时,它才认为查询可能通过仅索引扫描来执行。

所以你必须包括value本身在索引中,即使就像INCLUDE专栏-完全破坏了整个想法。不去。

你可能仍然可以做某物在短期内。两句关键的引言:

我想看看是否可以在短期内加快速度

json blob 有点大

数据类型

将演员表放到json从查询中。每次铸造都会增加无意义的成本。

压缩

一个主要的成本因素是压缩。 Postgres 必须“脱吐司” https://www.postgresql.org/docs/current/storage-toast.html整个大专栏,只是为了提取一些小属性。自从Postgres 14,您可以切换压缩算法(如果您的版本启用了支持!)。默认值由配置设置决定default_toast_compression https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-DEFAULT-TOAST-COMPRESSION,设置为pglz默认情况下。目前唯一可用的替代方案是lz4。您可以对每列进行设置。任何时候。

LZ4 (lz4)速度要快得多,而压缩量通常要少一些。速度大约是原来的两倍,但存储空间增加了大约 10%(具体取决于!)。如果性能不是问题,最好坚持使用默认 LZ 算法的更强压缩(pglz)。未来可能会有更多的压缩算法可供选择。

实施:

ALTER TABLE data
  ALTER COLUMN value SET COMPRESSION lz4;

设置新的COMPRESSION对于列不会自动重新压缩。 Postgres 会记住压缩方法,并且仅在强制解压缩时才重新压缩。您可能想要强制重新压缩现有值。您可以检查:

SELECT pg_column_compression(value) FROM data LIMIT 10;

相关博文:

  • https://www.postgresql.fastware.com/blog/what-is-the-new-lz4-toast-compression-in-postgresql-14 https://www.postgresql.fastware.com/blog/what-is-the-new-lz4-toast-compression-in-postgresql-14

GENERATED columns

当坚持破损的设计时,您可能只需添加一些(小!)生成的列来覆盖您的查询:

ALTER TABLE data
  ADD COLUMN name text GENERATED ALWAYS AS (value::json ->> 'name') STORED
, ADD COLUMN mnemonic text GENERATED ALWAYS AS (value::json ->> 'mnemonic') STORED
...

然后仅针对那些生成的列,不涉及大事value at all.

SELECT name, mnemonic, ... FROM data;

这将绕过主要的性能问题。

See:

  • PostgreSQL 中的计算/计算/虚拟/派生列 https://stackoverflow.com/questions/8250389/computed-calculated-virtual-derived-columns-in-postgresql/8250729#8250729

然而,您提到:

经常发生变化的是 json blob 中更下方的数据。

每次更改为value强制重新检查生成的列,从而增加写入成本。

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

查询 json / jsonb 列超级慢。我可以使用索引吗? 的相关文章

  • Jackson JSON + Java 泛型

    我正在尝试将以下 JSON 反序列化 映射到List
  • 如何使用重复的键动态生成 JSON 对象?

    我知道这听起来不可能 但我的老板告诉我 我必须使用 jQuery 通过 AJAX 后调用发送 JSON 并且必须具有重复的键 问题是 如果我写这样的东西 post someurl key1 value1 key2 value2 key2 v
  • 如何使用放心的方式在正文中发送 JsonObject 以进行 post 请求?

    我有一个使用 Google Gson 创建的 JsonObject JsonObject jsonObj gson fromJson response1 json JsonElement class getAsJsonObject 我还对现
  • PostgreSQL:有效地将 JSON 数组拆分为行

    我有一个表 表 A 其中包含一个包含 JSON 编码数据的文本列 JSON 数据始终是一个包含一到几千个普通对象的数组 我有另一个表 表 B 其中有几列 包括数据类型为 JSON 的列 我想从表 A 中选择所有行 将 json 数组拆分为其
  • 将类转换为 JSONObject

    我有好几堂这样的课 我想将类转换为 JSONObject 格式 import java io Serializable import com google gson annotations SerializedName public cla
  • Spark DataFrame 序列化为无效 json

    TL DR 当我倾倒 Spark 时DataFrame作为 json 我总是得到类似的结果 key1 v11 key2 v21 key1 v12 key2 v22 key1 v13 key2 v23 这是无效的 json 我可以手动编辑转储
  • 按值对 JSON 进行排序

    我有一个非常简单的 JSON 对象 如下所示 people f name john l name doe sequence 0 title president url google com color 333333 f name micha
  • 在android中从JSON生成listview

    我对 Android 完全陌生 目前正在尝试从从我的服务器中提取的 JSON 数组生成列表视图 我已经阅读了很多教程 但没有运气 有一种独特的方法可以做到这一点 请您指出一些适合开始的资源 我读过了this http www josecgo
  • 提高 PostgreSQL 1 亿数据左连接查询性能

    我在用Postgresql 9 2 version Windows 7 64 bit RAM 6GB 这是一个Java企业项目 我必须在我的页面中显示订单相关信息 有三个表通过左连接连接在一起 Tables TV HD 389772 行 T
  • PostgreSQL 仅当列存在时才重命名该列

    我在中找不到PostgreSQL 文档 https www postgresql org docs 12 sql altertable html如果有办法运行 ALTER TABLE tablename RENAME COLUMN IF E
  • 计算包含字母/数字的行数

    我想要实现的目标很简单 但是解释起来有点困难 我不知道在 postgres 中这是否真的可能 我处于相当基础的水平 SELECT FROM WHERE LEFT JOIN ON HAVING 等等基本的东西 我正在尝试计算包含特定字母 数字
  • 使用 ng-options 在 AngularJS 中使用 JSON 填充 select

    编辑 我的代码实际上确实有效 我只是一个有不相关问题的白痴 感谢大家的意见 所以我有一个 JSON 对象数组 格式如下 id id1 text text1 id id2 text text2 我想使用这些填充 AngularJS 选择字段
  • 为什么我的 postgis 不在几何字段上使用索引?

    Windows 上的 postgresql 9 5 postgis 2 2 我首先创建一个表 CREATE TABLE points id SERIAL ad CHAR 40 name VARCHAR 200 然后 添加一个几何字段 geo
  • JPA 和 PostqreSQL:长字符串持久化

    谁能告诉我如何使用 JPA 保存长文本 我使用 PostgreSQL 这是我在类中定义很长字符串的方法 Lob private String body 然而 这会产生一个类型的字段字符变化 255 在数据库中 此外 我尝试使用 Column
  • PostgreSql“运行安装后步骤...数据库集群初始化失败”

    我是一名 Windows 用户 我花了几个小时不断地安装和卸载 然后才使其正常工作 前 10 次左右才看到标题中的错误消息 我将其作为一个自我回答的问题放在这里 以防止其他人在安装时可能遇到同样的问题 并为像我这样第一次使用 Postgre
  • 优化 LATERAL join 中的慢速聚合

    在我的 PostgreSQL 9 6 2 数据库中 我有一个查询 该查询根据一些股票数据构建计算字段表 它为表中的每一行计算 1 到 10 年的移动平均窗口 并将其用于周期性调整 具体来说 CAPE CAPB CAPC CAPS 和 CAP
  • 更改 JSON.NET 序列化属性名称的方式

    如何更改 Newtonsoft JSON NET 序列化对象属性名称的方式 有几种方法 You can manually control how it serializes using the JsonTextWriter class ht
  • JSON 中的哈希到底是什么?

    我正在学习 JSON 但我发现你也可以将所谓的 哈希 放入 JSON 中 我在哪里可以找到什么是哈希 或者你能向我解释一下什么是哈希吗 另外 什么是哈希图 我有 C 和 C 经验 正在学习 JS Jquery 和 JSON 哈希是一个稀疏数
  • 唯一约束与唯一索引?

    之间有区别吗 CREATE TABLE p product no integer name text UNIQUE price numeric and CREATE TABLE p product no integer name text
  • 如何使用Gson仅从Json反序列化某些特定字段?

    我有以下 JSON 字符串 channel bvmt initValues data value instrumentIds TN0007250012 TN0007500010 instruments mnemonic ADWYA marc

随机推荐

  • 如何在 Chrome 的 PDF 查看器中显示 javascript File 对象及其名称?

    我有一个 PDF 文件 格式为Blob https developer mozilla org en US docs Web API Blob Blob对象 生成为jsPDF https github com MrRio jsPDF 我想显
  • 为什么 React/redux 状态会在刷新时重置?

    当我登录时 一切正常 但当我点击刷新或导航到其他地方时 状态就会重置 知道为什么吗 我希望能够从状态引用用户并获取名称等信息并在组件内使用它 但它只有在我登录后才起作用 然后它就会重置 另外 为什么我必须在mapstatetoprops中使
  • 导入数据集时出现问题:“扫描错误(...):第 1 行没有 145 个元素”

    我正在尝试使用 R 导入我的数据集read table Dataset df lt read table C dataset txt header TRUE 但我收到以下错误消息 Error in scan file what nmax s
  • JMeter 中默认的响应超时是多少?

    如果我们没有在 HTTP 请求 采样器中设置任何超时 任何人都可以帮助了解 JMeter 中的默认响应时间吗 Thanks 它默认为0 无超时 设置超时的推荐方法是使用 GUI 如果由于某种原因它不适合您 您可以使用以下属性 用户属性 fi
  • java 中的 C# Type.GetType() 是否有等效语法

    请告诉我 C 是否有等效语法Type GetType 在Java中 和等效语法Activator CreateInstance 在Java中 Thanks Type GetType 等效项
  • ES2015“导入”在带有 --harmony_modules 选项的节点 v6.0.0 中不起作用

    我正在使用节点 v6 0 0 并想使用 ES2016 ES6 但是我意识到 导入 语法不起作用 导入 不是在 ES2015 中编写模块化代码的基础吗 我尝试运行节点 harmony modules选项也是如此 但仍然出现有关 导入 的相同错
  • Python epsilon 不是最小的数

    什么是sys float info epsilon return 在我的系统上我得到 gt gt gt sys float info epsilon 2 220446049250313e 16 gt gt gt sys float info
  • OpenCV 3.0.0 SurfFeatureDetector 和 SurfDescriptorExtractor 错误

    我正在尝试实现 OpenCV 3 0 0 SURF 功能描述和检测 但在 OpenCV 站点上运行示例代码后 我收到了大量与 SURF 相关的错误 知道可能出了什么问题吗 谢谢 include
  • 如何在谷歌模拟中将 void* 参数设置为一组值?

    我正在使用 google mock 对我的代码进行单元测试 并且我试图通过 void 作为输出参数返回一组值 uint32 t bigEndianTestValues BIG ENDIAN FIELD MAX ELEMENTS 0xDEAD
  • 如何从IDE转向文本编辑器?

    多年来我一直在使用各种语言的 IDE VS IntelliJ Eclipse NetBeans FlashDevelop 等 而且我总是发现它们缓慢且混乱 是的 我知道窗口可以隐藏 重新排列等等 然而最近我已经学习并有点精通 VIM 并且已
  • 有没有可能通过 Firefox 扩展创建整个屏幕的屏幕截图?

    我目前正在使用 canvas 使用 JavaScript 创建屏幕截图 并将其编码为 base64 但是 我当前的屏幕截图仅包括实际的网页 没有其他内容 没有地址栏等 我想知道是否有可能实现整个屏幕的屏幕截图 任务栏和整个浏览器窗口 等 以
  • C++ 何时发生不完整类型错误

    谁能告诉我 C 编译器何时抛出 不完整类型错误 注意 我故意让这个问题有点开放式 以便我可以自己调试我的代码 当编译器看到前向声明但没有该类型的完整定义 而该类型正在某处使用时 通常会发生这种情况 例如 class A class B A
  • withCount() 不包括已删除的行?

    我怎样才能使withCount comments 还包括所有已删除 废弃的行 例如 如果我有 5 条评论 我删除了 1 条 我仍然期望withCount comments 返回 5 但实际上返回了 4 我的完整查询如下所示 query Po
  • 正则表达式之前或之后

    我想使用正则表达式来匹配字符串tofind 我有两种可能性 第一种 before tofind 第二个是 tofind after 如何将两个示例中的单词 tofind 与一个正则表达式行匹配 I used before tofind to
  • 如何从多个地方重定向到上一页?

    我可能在这里错过了一些非常简单的东西 假设我有一个名为Option 然后 我在视图中列出这些选项 并使用 启用 禁用 按钮来触发控制器操作 然后启用或禁用该特定的操作 Option 如果列表只在一个地方 我知道只需打电话redirect t
  • 在 www.instagram.com 上使用 Python/Selenium 接受 cookie 错误 [重复]

    这个问题在这里已经有答案了 我正在尝试使用 Firefox Python Selenium 使用以下代码登录 Instagram from time import sleep from selenium import webdriver b
  • 如何与多个用户一起使用 Hive

    我有几个用户使用同一个配置单元 现在我希望每个用户在配置单元中都有一个私有元数据 example 用户调用显示表 a1 a2 a3 用户b调用显示表 b1 b2 b3 当然 当用户运行查询时 他们无法访问其他用户的表 thanks 为了让新
  • 具有 TimeSpan 数据类型的 DataView RowFilter

    我尝试使用DataView RowFilter对于数据类型为 TimeSpan 的列 如下所示 dv RowFilter Convert time System String LIKE 17 12 00 我发现搜索参数 17 or 12 对
  • PHP Heredoc解析错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 这会产生输
  • 查询 json / jsonb 列超级慢。我可以使用索引吗?

    我正在尝试加快对 PostgreSQL 数据库中存储的一些 json 数据的查询速度 我继承了一个查询 PostgreSQL 表的应用程序 名为data有一个名为value其中 value 是 json 类型的 blobjsonb 它大约有