看看ST_Mem_Size.这也为您提供了toast表的大小,因此比pg_total_relation_size和其他内置的Postgres函数更合适 - 虽然这仅适用于较大的几何.回到你的问题,一点,
SELECT ST_Mem_Size(ST_MakePoint(0, 0));
Run Code Online (Sandbox Code Playgroud)
返回32个字节,这是4个双精度数(而不是你期望的2个).这样做的原因是存在其他元数据,例如存储的字节序.
添加SRID,用,
SELECT ST_Mem_Size(ST_SetSRID(ST_MakePoint(0, 0), 4326));
Run Code Online (Sandbox Code Playgroud)
返回32个字节.
现在,一个有两个点的Linestring,
SELECT ST_Mem_Size(ST_SetSRID(ST_GeomFromText('LINESTRING(0 0, 1 1)'), 4326));
Run Code Online (Sandbox Code Playgroud)
返回48个字节,现在只有16个字节,即2个双精度数,大于Point,正如您所期望的那样.
现在,如果你缓冲这一点,
SELECT ST_Mem_Size(ST_SetSRID(ST_Buffer(ST_MakePoint(0, 0), 10), 4326));
Run Code Online (Sandbox Code Playgroud)
你得到568个字节,这是因为每个四分之一圆圈段默认有8个点,加上最后一个重复的起点,你可以查看,
SELECT ST_NPoints(ST_SetSRID(ST_Buffer(ST_MakePoint(0, 0), 10), 4326));
Run Code Online (Sandbox Code Playgroud)
给你33*16 = 528,其他40个字节来自SRID,字节序等.