Postgres如何确定JSon列的大小?(或者我错过了什么?)

Postgres如何确定JSon列的大小?(或者我错过了什么?),json,postgresql,size,Json,Postgresql,Size,在研究使用JSon内容优化表大小的方法时,我遇到了一个意想不到的情况:JSon较小的列会占用数据库中更多的空间 在测试中创建了两个表,都有一个bigint和一个array JSon列。两个表(“当前”和“建议”)之间的区别在于第二个表中组成数组的项目数量较少。这应该会缩小它的尺寸,对吗 不完全是。出于某种原因,“建议”表占用了更多的空间,甚至构成JSON的ITEN更少。为了确保我没有做任何真正愚蠢的事情,请遵循一些用于阅读和创建ddata的附加信息和说明 SQL读取上述图像数据: SELECT

在研究使用JSon内容优化表大小的方法时,我遇到了一个意想不到的情况:JSon较小的列会占用数据库中更多的空间

在测试中创建了两个表,都有一个bigint和一个array JSon列。两个表(“当前”和“建议”)之间的区别在于第二个表中组成数组的项目数量较少。这应该会缩小它的尺寸,对吗

不完全是。出于某种原因,“建议”表占用了更多的空间,甚至构成JSON的ITEN更少。为了确保我没有做任何真正愚蠢的事情,请遵循一些用于阅读和创建ddata的附加信息和说明

SQL读取上述图像数据:

SELECT current.a as json_current, 
       pg_column_size(current.a) as column_size_current,
       jsonb_array_length(current.a) as array_length_current,
       proposal.a as json_proposal, 
       pg_column_size(proposal.a) as column_size_proposal,
       jsonb_array_length(proposal.a) as array_length_proposal
  FROM current
 INNER join proposal on proposal.id = current.id
这两个表都是使用以下方法创建的:

CREATE TABLE table_name AS 
SELECT source.id,
       to_jsonb(
          (SELECT array_to_json(array_agg(row_to_json(e)))
           FROM (SELECT source.idprop1,
                        COALESCE(source.idprop2, 0),
                        COALESCE(source.idprop3, 0),
                        source.prop4,
                        source.prop5
                 FROM source
                 WHERE source.id_master = master_source.id_master
                ) e 
          )
       ) as a
FROM master_source
GROUP BY master_source.id
第二个表(建议书)中有以下附加条款,其中:

AND (source.prop2 is not null 
     OR source.prop3 is not null 
     OR (source.prop4 is not null and source.prop3 > 0)
     OR (source.prop5 is not null and source.prop4 > 0)
我是否缺少或期望博士后能取得这样的成绩

更新:关于TOAST

正如预期的那样,创建了用于存储大型文本的表,但正如我们在下图中所看到的,JSON值不足以存储在那里


也许第一个表中的值足够大,以致于在TOAST表中的存储不一致。比较
pg\u total\u relationship\u size
@Laurenz,我会尽快做的,泰@LaurenzAlbe我做了一些研究,发现TOAST甚至没有被使用(TOAST表是空的),因为JSON没有达到默认大小(8kb)。在阅读有关大值和TOAST如何工作的文章时,我看到了一些可以解释的东西:压缩。也许-我真的不能说-具有更多唯一值的第二个表产生的压缩结果不如第一个表。正如我所说,这是一个猜测。不知道该怎么处理这个问题。我应该关闭它吗?根据我们目前掌握的信息量,是的,你应该关闭它。如果您提供更多数据点(例如,实际值、列中的二进制数据,如
pageinspect
,…),则问题可能会得到答案。