Ответ 1
В принципе, значения NULL
занимают 1 бит в растровом файле NULL. Но это не так просто.
нулевой битмап (для каждой строки) существует только там, если хотя бы один столбец в этой строке содержит значение NULL
. Это может привести к эффекту парадокса в таблицах с 9 или более столбцами: присвоение первого значения NULL
столбцу может занимать больше места на диске, чем записывать в него значение. И наоборот, при последнем столбце, не равном нулю, нулевая битовая карта отбрасывается для строки.
Физически исходная нулевая битовая карта занимает 1 байт между HeapTupleHeader
(23 байта) и фактическими данными столбца или строкой OID
(если вы все еще должны использовать это), что всегда начинать с кратного MAXALIGN
(обычно 8 байт). Это оставляет 1 байт заполнения, который используется исходной нулевой битовой картой.
Фактически Хранилище NULL абсолютно бесплатно для таблиц из 8 столбцов или меньше.
После этого для следующих столбцов MAXALIGN * 8
выделяются еще MAXALIGN
байты (обычно 8) (обычно 64). Etc.
Подробнее в руководстве и по этим связанным вопросам:
- Сколько дискового пространства необходимо для хранения значения NULL с помощью postgresql DB?
- Не использует ли NULL в PostgreSQL по-прежнему использовать растровое изображение NULL в заголовке?
- Сколько записей я могу хранить в 5 Мбайтах PostgreSQL на Heroku?
После того, как вы понимаете выравнивание элементов данных, вы можете дополнительно оптимизировать хранение:
Но случаи редки, когда вы можете сэкономить значительное количество места. Обычно это не стоит усилий.
@Daniel уже охватывает эффекты на размер индекса.