在PostGIS中,数据类型Geography(Point, 4326)的大小是多少?

4

它的构造函数接受一个POINT和一个SRID参数。由于POINT是两个double类型(每个8字节),SRID是一个整型(4字节),因此可以假设该结构体需要占用8*2+4=20字节的存储空间。


2
我不知道你问题的答案,但我可以告诉你,这并不像应用简单计算那样容易。数据库中存储的不仅是数据,还有对该数据的索引。你甚至可以拥有多种类型的索引(有多种数据库索引类型(唯一、多列等),对于地理数据,你可以使用GIST索引(广义搜索树))。 - Mathias Vonende
srid 不会为每一行存储,它是该列的一个特征。 粗略估计将是 no_rows * 2 * 8 + 4 - valentin
1个回答

11

看一下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、字节序等。


谢谢您的回答。请问一下SRID,它是针对每个记录还是整个列存储的呢?来自http://en.wikipedia.org/wiki/SRID: 在启用空间功能的数据库中[...], SRID用于唯一标识用于定义空间数据列或空间列中的单个空间对象的坐标系(取决于空间实现)。 - iloo
是的,因此每个几何记录中只包含一次SRID,这就是为什么当您从具有设置SRID的两个点的Point转换为LineString时,大小仅增加16个字节,因为SRID已经被记录。 - John Powell
我理解向LineString添加更多的点并不会增加更多的SRID。但是我们可以有多个LineString对象,每个记录一个,然后我仍然想知道每个记录是否包含自己的SRID。 - iloo
1
是的,每个记录仍将包含自己的SRID,因为您可以在同一列中混合具有不同SRID的几何图形,尽管在我看来这不是一个好主意。 - John Powell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接