Сколько дискового пространства требуется для хранения значения NULL с использованием базы данных postgresql? - PullRequest
40 голосов
/ 20 ноября 2010

скажем, у меня в таблице есть столбец, определяющий следующее:

"MyColumn" smallint NULL

Для хранения значения, такого как 0, 1 или что-то еще, нужно 2 байта (1). Но сколько места нужно, если я установлю «MyColumn» в NULL? Нужно ли будет 0 байтов?

Существуют ли дополнительные необходимые байты для целей администрирования или такие вещи для каждого столбца / строки?

(1) http://www.postgresql.org/docs/9.0/interactive/datatype-numeric.html

Ответы [ 3 ]

52 голосов
/ 05 октября 2011

Ларами прав насчет растрового изображения, и он ссылается на нужное место в руководстве.Тем не менее, это почти, но не совсем правильно:

Таким образом, для любой данной строки с одним или несколькими нулями добавленный размер будет размером растрового изображения (N битов для N-столбца).таблица, округленная в большую сторону).

Необходимо учитывать выравнивание данных.HeapTupleHeader (на строку) имеет длину 23 байта, фактические данные столбца всегда начинаются с кратного MAXALIGN (обычно 8 байтов).Это оставляет один байт заполнения, которое может использоваться нулевым растровым изображением.Фактически NULL-хранилище абсолютно свободно для таблиц размером до 8 столбцов .

После этого для следующих MAXALIGN * 8 (обычно 64) выделяется еще один MAXALIGN (обычно 8)колонны.И т. Д. Всегда для общего числа пользовательских столбцов ( все или ничего ).Но только если в строке есть хотя бы одно фактическое значение NULL.

Я провел обширные тесты, чтобы проверить все это.Подробнее:

45 голосов
/ 20 ноября 2010

Пустые столбцы не сохраняются. Строка имеет битовую карту в начале и один бит на столбец, который указывает, какие из них являются нулевыми или ненулевыми. Растровое изображение может быть опущено, если все столбцы не равны NULL в строке. Таким образом, для любой данной строки с одним или несколькими нулями добавляемый размер будет соответствовать размеру растрового изображения (N битов для таблицы N-столбцов, округленных в большую сторону).

Более подробное обсуждение документов здесь

0 голосов
/ 20 ноября 2010

Требуется 1 байт (0x00), однако большую часть пространства занимает структура таблицы, добавление этого значения может изменить что-то (например, добавление строки), для которого требуется больше места, чем сумма данных в это.

Редактировать: Кажется, Ларами знает о нуле больше, чем я:)

...