Всъщност е по-сложно от това.
Нулевата растерна карта се нуждае от един бит на колона в реда, закръглен до пълни байтове. Има го само ако действителният ред включва поне една стойност NULL и е напълно разпределен в този случай. NOT NULL
ограниченията не влияят пряко на това. (Разбира се, ако всички полета на вашата таблица са NOT NULL
, никога не може да има нулева растерна карта.)
"Heap tuple header" (на ред) е с дължина 23 байта. Действителните данни започват с кратно на MAXALIGN
(Максимално подравняване на данните ) след това, което обикновено е 8 байта на 64-битова ОС (4 байта на 32-битова ОС). Изпълнете следната команда от вашата двоична директория на PostgreSQL като root, за да получите окончателен отговор:
./pg_controldata /path/to/my/dbcluster
При типична базирана на Debian инсталация на Postgres 12 това би било:
sudo /usr/lib/postgresql/12/bin/pg_controldata /var/lib/postgresql/12/main
Така или иначе, между заглавката и подравненото начало на данните има един свободен байт, който нулевото растерно изображение може да използва. Стига таблицата ви да има 8 колони или по-малко , NULL хранилището е ефективно абсолютно безплатно (що се отнася до дисковото пространство).
След това друг MAXALIGN
(обикновено 8 байта) се разпределя за нулевата растерна карта, за да покрие други (обикновено) 64 полета. И т.н.
Това е валидно за поне версии 8.4 - 12 и най-вероятно няма да се промени.