Сколько дискового пространства требуется для хранения значения 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), однако большую часть пространства занимает структура таблицы, добавление этого одного значения может изменить что-то (например, добавление строки), для которого требуется больше места, чем сумма данных в нем.

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

Другие вопросы по тегам