Подтвердить что ты не робот

Сколько дискового пространства необходимо для хранения значения 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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Изменить: Laramie, похоже, знает больше об нуле, чем мне:)