Postgresql 从Postgres返回JSON很慢

Postgresql 从Postgres返回JSON很慢,postgresql,performance,jsonb,Postgresql,Performance,Jsonb,我在Postgres中有一个带有JSONB列的表,表的每一行都包含一个大的JSONB对象(~4500个键,JSON字符串在txt文件中大约为110KB)。我想查询这些行并获取整个JSONB对象 查询速度很快——当我运行EXPLAIN ANALYZE或省略JSONB列时,它会在100-300毫秒内返回。但当我执行完整查询时,它会以分钟为顺序返回。对以前版本的数据进行完全相同的查询也很快(每个JSONB大约有以前版本的一半大) 一些注意事项: 这在Python中结束(通过SQLAlchemy/ps

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

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

一些注意事项:

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

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


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

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


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

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