我在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输出的方法,但是它们导致了进一步的性能损失 - 它最终更快地返回整个对象。
答案 0 :(得分:0)
这不一定是解决方案,但这是一个更新:
通过在Postgres查询中将JSON列强制转换为text
,我能够大大减少查询执行并在Python端获取结果。
在Python端,对结果集中的每一行执行json.loads
会使我看到使用常规查询的确切时间。但是,使用ujson
库我可以获得显着的加速。在查询中转换为文本,然后在python端调用ujson.loads
的性能大约比在查询中返回JSON快3倍。