Postgresql 从JSONB字段中选择慢速

Postgresql 从JSONB字段中选择慢速,postgresql,jsonb,Postgresql,Jsonb,我有一张相对较小的桌子(约5万行)。当我选择所有记录时,需要大约40秒。该表有3个JSONB列。当我选择除JSONB之外的每一列时,查询需要大约700ms 如果我只添加一个JSONB字段,查询时间会跳到近10秒 我从不使用where子句引用JSONB中的内容,只是选择*。尽管如此,我还是尝试添加GIN索引,因为我经常看到它们被提到是JSONB的性能提升器 我已经完全真空了 Postgres 9.6版 explain (analyze, buffers) select * from messag

我有一张相对较小的桌子(约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

Jsonb是PostgreSQL varlena数据类型-这意味着当值大于2KB时,它将存储在辅助表(名为TOAST table)中。指向TOAST表的指针存储在主表中。所以,当您不接触Jsonb列时,就不会读取该值

在这种情况下,GIN索引没有帮助。它只对搜索有用

50K值上的10秒是很长的时间-可能您的Jsonb值相当长,或者您的IO系统性能不好。请检查桌子的大小,并检查IO的性能。廉价的云计算机器通常具有糟糕的IO


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

谢谢您提供的信息。有些大于2kb,有些则不大于2kb。它在我的MacBookPro上运行得甚至很慢,尽管有点慢faster@ZekeAlexandreNierenberg-如果只存储JSON值而不在内部搜索,那么可以使用JSON类型代替Jsonb。Jsonb的格式更复杂,反序列化更困难。转换为JSON有很大帮助。尽管还不如没有专栏的表演那么扎实,但它确实很好地发挥了作用。继续,把它加到答案上,我会把它标对的@ZekeAlexandreNierenberg——我在那里写了一张纸条。每次访问TOAST数据都会变慢。它对于文本类型是可测量的。这是我们想要的功能。几乎所有时候,您都需要快速访问一些数字短字段-成本、计数、名称等等。。长字段如注释、注释通常并不重要。当然,也有例外。