gli*_*its 3 postgresql performance jsonb
我在 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 输出的方法,但它们对性能造成了进一步的严重影响——最终返回整个对象的速度更快。
这不一定是解决方案,但这是一个更新:
通过将 JSON 列转换到textPostgres 查询中,我能够大幅减少 Python 端的查询执行和结果获取。
在 Python 端,json.loads对结果集中的每一行进行操作使我能够得到与使用常规查询一样的准确时间。然而,通过该ujson库,我能够获得显着的加速。在查询中转换为文本,然后ujson.loads在 python 端调用的性能比在查询中简单返回 JSON 的速度大约快 3 倍。