Размер хранения NULL в Postgresql: сравнение с числами
Быстрый ответ
В PostgreSQL значение NULL
не занимает дополнительное место на диске в столбце таблицы. Минимальное использование дискового пространства достигается благодаря битовым картам PostgreSQL, где каждый бит обозначает возможность присутствия NULL
в определенном столбце. Так, если количество столбцов, содержащих NULL
, невелико, потребуется всего несколько байт. Чтобы не удивляться увеличению объема данных, стоит помнить, что он может расти из-за служебной информации, даже если значения в этих столбцах являются NULL
.
CREATE TABLE example (id SERIAL, info TEXT); -- Создаем тестовую таблицу
INSERT INTO example (info) VALUES (NULL); -- Запись NULL не требует дополнительного места
Внутреннее устройство NULL
В PostgreSQL особую роль играет структура HeapTupleHeader
. Она хранит метаданные каждой строки и занимает фиксированный объем в 23 байта, независимо от того, есть ли в строке значения NULL
.
Размер данных в PostgreSQL определен с помощью параметра MAXALIGN
, который обычно равен 8 байтам на 64-битных системах. Если в таблице менее 8 столбцов, то битовая карта, отражающая NULL
значения, не требует дополнительного места, так как она уже включена в HeapTupleHeader
. При превышении числа столбцов размером кратно восьми, для битовой карты выделяется дополнительное место, равное значению MAXALIGN
.
Давайте продемонстрируем это на примере SQL:
CREATE TABLE space_test (
id SERIAL,
info TEXT,
details TEXT,
more_info TEXT
);
-- Все остается в пределах исходного размера битовой карты. Минимизация затрат!
Присутствие NULL
в столбцах info
, details
и more_info
не приводит к увеличению размера таблицы, это возможно благодаря эффективности PostgreSQL.
Аномалии в работе с NULL
Не нужно бояться, что наличие большого числа столбцов, в которых может присутствовать NULL
, приведет к радикальному увеличению размера таблицы. Умная архитектура PostgreSQL позволяет снизить использование дискового пространства. В основном, набухание базы данных происходит из-за остаточных данных после манипуляций с данными, а не из-за NULL
.
Визуализация
Представьте, что база данных это книжный шкаф, где каждая книга это строка данных, а страница в книге это поле данных. Если страница наполнена текстом, книга становится тяжелее, в то время как NULL
можно сравнить с пустой страницей, которая не прибавляет вес. Как и пустые страницы в книге, PostgreSQL позволяет минимизировать использование дискового пространства при хранении NULL
.
Выравнивание данных и производительность
Если продолжить аналогию с книжным шкафом, то выравнивание книг аналогично процессу, который PostgreSQL использует для обеспечения высокой производительности. SQL-движок выравнивает данные по границам MAXALIGN
для более эффективного доступа к памяти и оптимизации работы базы данных.
Работа с большими таблицами
Администраторам баз данных полезно помнить, что не только содержимое, но и количество столбцов в таблице влияет на используемый объем дискового пространства. Более 8 столбцов требуют дополнительного места для хранения битовой карты.
-- Проектировать таблицу следует с учетом оптимального использования места
CREATE TABLE wide_table (
col1 INT,
col2 INT,
-- Перед добавлением дополнительных столбцов следует обдумать насколько это необходимо.
-- ...
);
Мониторинг использования дискового пространства
Важно контролировать использование дискового пространства. Для этого в PostgreSQL есть функция pg_column_size
, которая позволяет измерять размер строки, включая NULL
. И помните о регулярном выполнении операции VACUUM
для поддержания оптимальной работы вашей базы данных.
Полезные материалы
- PostgreSQL: Документация: 16: 73.6. Структура страницы базы данных – Познакомьтесь с тем, как устроено хранение данных в PostgreSQL.
- Nulls – PostgreSQL wiki — Узнайте больше о работе с
NULL
в PostgreSQL. - Modern SQL: NULL — Современное видение работы с
NULL
в SQL-базах данных. - Reddit – Погрузитесь во что угодно — Обсуждение использования
NULL
в PostgreSQL на основе практического опыта.