【问题标题】:Returning JSON from Postgres is slow从 Postgres 返回 JSON 很慢
【发布时间】:2018-03-11 11:53:01
【问题描述】:

我在 Postgres 中有一个带有 JSONB 列的表,表的每一行都包含一个大型 JSONB 对象(约 4500 个键,JSON 字符串在 txt 文件中约为 110 KB)。我想查询这些行并获取整个 JSONB 对象。

查询很快——当我运行EXPLAIN ANALYZE 或省略 JSONB 列时,它会在 100-300 毫秒内返回。但是当我执行完整的查询时,它需要几分钟的时间。对先前版本的数据进行完全相同的查询也很快(每个 JSONB 大约是原来的一半)。

一些注意事项:

  • 这最终会出现在 Python 中(通过 SQLAlchemy/psycopg2)。我担心查询执行器正在将 JSONB 转换为 JSON,然后将其编码为文本以通过网络传输,然后在 Python 端再次对 JSON 进行编码。 它是否正确?如果是这样,我该如何缓解这个问题?当我选择 JSONB 列为::text 时,查询速度大约是原来的两倍。

  • 我只需要 JSON 的一小部分(大约 300 个键或 6% 的键)。我尝试了在查询中过滤 JSON 输出的方法,但它们导致性能进一步下降——最终返回整个对象的速度更快。

【问题讨论】:

  • 首先尝试在纯 sql 中创建和运行查询,并在与 postgres 服务器相同的节点上运行它(如果可能),这将消除任何 sqlalchemy/网络问题。接下来,提供有关数据和您运行的实际 sql 的更多详细信息。和查询时间。
  • @JonScott 当你说用纯 SQL 重写查询时,这是否意味着我应该从本质上删除任何 PostgreSQL 特定功能(如 JSON)?

标签: postgresql performance jsonb


【解决方案1】:

这不一定是解决方案,但这里有一个更新:

通过在 Postgres 查询中将 JSON 列转换为 text,我能够大幅减少 Python 端的查询执行和结果获取。

在 Python 端,对结果集中的每一行执行json.loads 可以让我了解使用常规查询的确切时间。然而,使用ujson 库,我能够获得显着的加速。在查询中转换为文本,然后在 python 端调用 ujson.loads 的性能比在查询中简单地返回 JSON 快大约 3 倍。

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 2017-09-17
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2016-11-22
    • 2021-12-14
    • 2017-05-19
    • 2011-03-22
    相关资源
    最近更新 更多