Сколько дискового пространства необходимо для хранения значения NULL с помощью postgresql DB?
скажем, у меня есть столбец в моей таблице, который определяет следующее:
"MyColumn" smallint NULL
Сохранение значения, такого как 0, 1 или что-то еще, должно быть 2 байта (1). Но сколько места нужно, если я установил "MyColumn" в NULL? Нужно ли 0 байтов?
Есть ли дополнительные необходимые байты для целей администрирования или такие вещи для каждого столбца/строки?
(1) http://www.postgresql.org/docs/9.0/interactive/datatype-numeric.html
Ответы
Ответ 1
Нулевые столбцы не сохраняются. Строка имеет растровое изображение в начале и один бит на столбец, который указывает, какие из них являются нулевыми или ненулевыми. Растровое изображение может быть опущено, если все столбцы не равны нулю в строке. Таким образом, для любой заданной строки с одним или несколькими нулями размер, добавленный к нему, будет иметь размер битмапа (N бит для таблицы N-столбцов, округленный вверх).
Более подробное обсуждение документов здесь
Ответ 2
Laramie прав о растровом изображении, и он ссылается на нужное место в руководстве. Тем не менее, это почти, но не совсем правильно:
Итак, для любой заданной строки с одним или несколькими нулями размер добавленного к ней будет битбип (N бит для таблицы N-столбцов, округленный вверх).
Необходимо учитывать выравнивание данных. HeapTupleHeader
(для каждой строки) имеет длину 23 байта, фактические данные столбца всегда начинаются с кратного MAXALIGN
(обычно 8 байтов). Это оставляет один байт заполнения, который может быть использован нулевым растровым изображением. Фактически NULL-хранилище абсолютно бесплатно для таблиц до 8 столбцов.
После этого для следующих столбцов MAXALIGN * 8
(обычно 64) выделяются другие MAXALIGN
(обычно 8) байты. И т.д. Всегда для общего количества столбцов пользователя (все или ничего). Но только если в строке есть хотя бы одно фактическое значение NULL.
Я провел обширные тесты, чтобы проверить все это. Подробнее:
Ответ 3
Он должен содержать 1 байт (0x00), однако структура таблицы, которая составляет большую часть пространства, добавляет это значение, может что-то изменить (например, добавить строку), которая требует больше места, чем сумма данных в он.
Изменить: Laramie, похоже, знает больше об нуле, чем мне:)