从Postgres返回JSON很慢

时间:2017-09-29 14:34:53

标签: postgresql performance jsonb

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

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

一些注意事项:

  • 最终以Python(通过SQLAlchemy / psycopg2)结束。我担心查询执行器正在将JSONB转换为JSON,然后将其编码为文本以通过线路传输,然后在Python端再次进行JSON编码。 它是否正确?如果是这样,我怎么能缓解这个问题呢?当我选择JSONB列为::text时,查询速度大约是其两倍。

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

1 个答案:

答案 0 :(得分:0)

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

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

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