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