Не использует ли NULL в PostgreSQL по-прежнему использовать NULL-битмап в заголовке?

По-видимому, PostgreSQL хранит пару значений в заголовке каждой строки базы данных .

Если я не использую значения NULL в этой таблице, то есть ли еще нулевое битовое изображение?
Не влияет ли определение столбцов с NOT NULL ?

На самом деле это сложнее.

Нулевой битмап требует один бит за столбец в строке, округленный до полных байтов. Только там, если фактическая строка включает по крайней мере одно значение 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 

В любом случае, есть один свободный байт между заголовком и выровненным началом данных, который может использовать нулевое bitmap. До тех пор, пока ваша таблица имеет 8 столбцов или меньше , хранилище NULL эффективно абсолютно бесплатно (в отношении дискового пространства).

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

Это допустимо, по крайней мере, для версий 8.4-9.6 и, скорее всего, не изменится.

Нулевой битмап присутствует только в том случае, если бит HEAP_HASNULL установлен в t_infomask. Если он присутствует, он начинается сразу после фиксированного заголовка и занимает достаточно байтов, чтобы иметь один бит на столбец данных (т. Е. Бит t_natts вообще). В этом списке бит 1 бит указывает не-null, 0 бит – это нуль. Когда битмап отсутствует, все столбцы принимаются не-null.

http://www.postgresql.org/docs/9.0/static/storage-page-layout.html#HEAPTUPLEHEADERDATA-TABLE

поэтому для каждых 8 столбцов вы используете один байт дополнительного хранилища. Тогда для каждого миллиона строк, которые занимают один мегабайт памяти. На самом деле это не так важно. Я бы определил таблицы, как их нужно было определить, и не беспокоиться о нулевых заголовках.

Interesting Posts

Как суммировать числовые элементы списка

Почему приложение висит

Базовая реализация Android GCM

Получение «ошибки: закрыто» дважды на «adb reverse»

Настройки области уведомлений Windows 7 заблокированы

Не удается получить доступ к общему диску в одном и том же имени машины uisng, но может получить доступ к IP-адресу

Подключиться к Windows Server 2012 только с действующим сертификатом клиента?

Расширение родительского контейнера с высотой 100% для учета плавающего содержимого

MS Word: управление приоритетами между стилями таблицы и абзаца

Есть ли ярлык для «Отметить все сообщения как прочитанные» в Outlook?

Как использовать использование позднего связывания для получения экземпляра excel?

Разница между scanf (“% c”, & c) и scanf (“% c”, & c)

Как составить график данных банковского счета в Excel с таблицей изменений баланса?

Notepad ++ Найти / заменить номер с добавочным значением

Убедитесь, что вход в UITextField только числовой

Давайте будем гением компьютера.