它的构造函数接受一个POINT和一个SRID参数。由于POINT是两个double类型(每个8字节),SRID是一个整型(4字节),因此可以假设该结构体需要占用8*2+4=20字节的存储空间。
看一下ST_Mem_Size。它可以给你Toast表的大小,因此比pg_total_relation_size和其他内置的Postgres函数更适合,因为它们不会显示这些信息,尽管这仅适用于较大的几何对象。回到你的问题,对于一个点,
SELECT ST_Mem_Size(ST_MakePoint(0, 0));
返回32字节,相当于4个double(而不是您期望的2个)。原因是有额外的元数据,例如端序存储。
加入SRID,使用以下方式:
SELECT ST_Mem_Size(ST_SetSRID(ST_MakePoint(0, 0), 4326));
返回32字节。
现在,一个包含两个点的线串,
SELECT ST_Mem_Size(ST_SetSRID(ST_GeomFromText('LINESTRING(0 0, 1 1)'), 4326));
返回48字节,现在只有16字节,即2个double类型的变量大小,比Point类型大,这是预期的。
现在,如果您缓存此点,则...
SELECT ST_Mem_Size(ST_SetSRID(ST_Buffer(ST_MakePoint(0, 0), 10), 4326));
您得到了568个字节,这是由于每个四分之一圆段默认有8个点,并且在末尾重复了一个起始点,您可以通过以下方式进行检查:
SELECT ST_NPoints(ST_SetSRID(ST_Buffer(ST_MakePoint(0, 0), 10), 4326));
计算33乘以16得到528,另外的40个字节来自于SRID、字节序等。
no_rows * 2 * 8 + 4
。 - valentin