当前位置: 首页 > 知识库问答 >
问题:

从JSONB字段慢速选择

谭修竹
2023-03-14

我有一张相对较小的桌子(约5万行)。当我选择所有记录时,需要大约40秒。该表有3个JSONB列。当我选择除JSONB之外的每一列时,查询大约需要700ms。

如果我只添加一个JSONB字段,查询时间会跳到近10秒。

我从来没有使用where子句引用JSONB中的内容,只是选择*。尽管如此,我还是尝试添加GIN索引,因为我经常看到它们被提到是JSONB的性能提升器。

我已经运行了一个完全真空。

Postgres 9.6版

 explain (analyze, buffers) select * from message;
   Seq Scan on message  (cost=0.00..5541.69 rows=52969 width=834) (actual 
   time=1.736..116.183 rows=52969 loops=1)
     Buffers: shared hit=64 read=4948
   Planning time: 0.151 ms
   Execution time: 133.555 ms

共有1个答案

平元明
2023-03-14

Jsonb是PostgreSQL varlena数据类型——这意味着当值大于2KB时,它会存储在辅助表(称为TOAST表)中。指向TOAST表的指针存储在主表中。所以当您不触摸Jsonb列时,则不会读取此值。

GIN索引在这种情况下没有帮助。它仅用于搜索。

50K值10秒是很长的时间——也许您的Jsonb值很长,或者您的IO系统性能不佳。请检查表的大小,并检查IO的性能。廉价的云机器通常有糟糕的IO。

减速的另一个可能原因是Jsonb数据类型的复杂性。Jsonb是json子对象的序列化树。如果您不需要Jsonb数据类型的一些特殊功能,那么使用JSON数据类型。这只是测试(仅在输入时检查JSON格式)。JSONB的输出比Jsonb快,因为JSON是内部文本,不需要任何操作。Jsonb的输出应该是序列化的,什么更昂贵。

 类似资料:
  • 在Postgres9.5中,我无法从JSONB字段中的属性中选择非空值 我还尝试使用NotNull。 当我运行其中一个时,我收到错误42883。“错误:运算符不存在。JSONB->>布尔提示:没有与给定名称和参数类型匹配的运算符。您可能需要添加显式类型转换。”

  • 针对Postgres数据库的某个索引SELECT查询所花费的时间非常可变--从50毫秒到多秒,有时甚至是几分钟,即使在最轻的负载下也是如此。 你能为26秒的差距提出一个解释吗? 关于并发的注意事项:即使只有一个请求也有很大的可变性:端到端50-300毫秒,但是当一个用户提交一批大约100个这样的查找时(可能有10-20个同时运行),很可能有几个查找需要5-10秒。然而C3P0的统计数据从来没有比:

  • 我正在尝试从一个select表单中获取一个时间值。我在代码中看不到任何错误,尝试更改所有类名和变量,但值仍然没有被get select。(提交表单后我看不到所选的值) 代码添加如下:

  • 问题内容: 使用Python,如何将字段提取为变量?基本上,我将其转换为: 像 问题答案: 假设您将该字典存储在一个名为值的变量中。要进入变量,请执行以下操作: 如果该json位于文件中,请执行以下操作以加载它: 如果该json来自URL,请执行以下操作以加载它: 要打印所有条件,您可以:

  • 问题内容: 我正在使用Postgresql 9.4,并具有一个表,带有和,如下所示: 如何在列的内部字段上将每个组作为数组返回?具体来说,我正在寻找的结果是: 试: 产量: 问题答案: 您必须使用运算符,而不是在正确的操作数是json路径时使用。试试这个: 产量:

  • 我正在通过Postgres Jsonb留档,但无法找到一个小问题的解决方案,我有。 我有一张桌子:MY_TABLE 具有以下列: 用户、姓名、数据和购买 需要注意的是,“数据”是一个jsonb,有多个字段。“Data”中的一个字段是“Attribute”,但它当前是一个字符串。我如何才能将其更改为字符串列表? 我曾尝试使用json\u build\u数组,但没有任何运气 例如,我希望我的jsonb