【发布时间】: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