Это на самом деле сложнее, чем это.
Для нулевого растрового изображения требуется один бит на столбец в строке, округленный до полных байтов. Он существует только в том случае, если фактическая строка содержит хотя бы одно значение NULL и полностью выделена в этом случае. NOT NULL
ограничения напрямую не влияют на это. (Конечно, если все поля вашей таблицы NOT NULL
, никогда не может быть нулевого растрового изображения.)
«Заголовок кортежа кучи» (на строку) имеет длину 23 байта. Фактические данные начинаются с кратного MAXALIGN
после этого, что обычно составляет 8 байтов в 64-битной ОС (4 байта в 32-битной ОС). Запустите следующую команду из вашего двоичного каталога PostgreSQL от имени пользователя root, чтобы получить окончательный ответ:
./pg_controldata /path/to/my/dbcluster
В типичной установке Debian Postgres 9.3 это будет:
sudo /usr/lib/postgresql/9.3/bin/pg_controldata /var/lib/postgresql/9.3/main
В любом случае между заголовком и выровненным началом данных есть один свободный байт, который может использовать нулевое растровое изображение. Пока ваша таблица имеет 8 столбцов или меньше , NULL-хранилище фактически абсолютно свободно (в том, что касается дискового пространства).
После этого еще MAXALIGN
(обычно 8 байт) выделяется для нулевого растрового изображения (плюс заполнение), чтобы покрыть другие (обычно) 64 поля. И т.д.
Это действительно как минимум для версий 8.4 - 9.6 и, скорее всего, не изменится.