Размер типа данных Geography (Point, 4326) в PostGIS?


Его конструктор принимает точку и SRID. Поскольку POINT-это два двойника (по 8 байт каждый), SRID-целое число (4 байта), можно ли предположить, что полная структура занимает 8*2+4=20 байт места для хранения?

1 2

1 ответ:

Взгляните на ST_Mem_Size . Это дает вам размер таблиц тостов, а также, Так что более подходит, чем pg_total_relation_size и другие встроенные в Postgres функции, которые не делают - хотя это относится только к большим геометриям. Возвращаясь к вашему вопросу, для точки,

SELECT ST_Mem_Size(ST_MakePoint(0, 0));

Возвращает 32 байта, то есть 4 двойника (вместо ожидаемых 2). Причина этого заключается в том, что существуют дополнительные метаданные, такие как endianness для хранения.

Добавить в SRID, with,

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 двойника, больше точки, как и следовало ожидать.

Теперь, если вы буферизуете эту точку,

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, байтов и т. д.