Размер хранения NULL в Postgresql: сравнение с числами

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

В PostgreSQL значение NULL не занимает дополнительное место на диске в столбце таблицы. Минимальное использование дискового пространства достигается благодаря битовым картам PostgreSQL, где каждый бит обозначает возможность присутствия NULL в определенном столбце. Так, если количество столбцов, содержащих NULL, невелико, потребуется всего несколько байт. Чтобы не удивляться увеличению объема данных, стоит помнить, что он может расти из-за служебной информации, даже если значения в этих столбцах являются NULL.

SQL
Скопировать код
CREATE TABLE example (id SERIAL, info TEXT);  -- Создаем тестовую таблицу
INSERT INTO example (info) VALUES (NULL);  -- Запись NULL не требует дополнительного места
Кинга Идем в IT: пошаговый план для смены профессии

Внутреннее устройство NULL

В PostgreSQL особую роль играет структура HeapTupleHeader. Она хранит метаданные каждой строки и занимает фиксированный объем в 23 байта, независимо от того, есть ли в строке значения NULL.

Размер данных в PostgreSQL определен с помощью параметра MAXALIGN, который обычно равен 8 байтам на 64-битных системах. Если в таблице менее 8 столбцов, то битовая карта, отражающая NULL значения, не требует дополнительного места, так как она уже включена в HeapTupleHeader. При превышении числа столбцов размером кратно восьми, для битовой карты выделяется дополнительное место, равное значению MAXALIGN.

Давайте продемонстрируем это на примере SQL:

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

SQL
Скопировать код
-- Проектировать таблицу следует с учетом оптимального использования места
CREATE TABLE wide_table (
    col1 INT,
    col2 INT,
    -- Перед добавлением дополнительных столбцов следует обдумать насколько это необходимо.
    -- ...
);

Мониторинг использования дискового пространства

Важно контролировать использование дискового пространства. Для этого в PostgreSQL есть функция pg_column_size, которая позволяет измерять размер строки, включая NULL. И помните о регулярном выполнении операции VACUUM для поддержания оптимальной работы вашей базы данных.

Полезные материалы

  1. PostgreSQL: Документация: 16: 73.6. Структура страницы базы данных – Познакомьтесь с тем, как устроено хранение данных в PostgreSQL.
  2. Nulls – PostgreSQL wiki — Узнайте больше о работе с NULL в PostgreSQL.
  3. Modern SQL: NULL — Современное видение работы с NULL в SQL-базах данных.
  4. Reddit – Погрузитесь во что угодно — Обсуждение использования NULL в PostgreSQL на основе практического опыта.