Низкоуровневая организация данных
Низкоуровневая организация данных — это фундаментальный аспект администрирования PostgreSQL, который раскрывает, как СУБД физически хранит и управляет информацией на диске.
Понимание этой архитектуры позволяет:
-
Эффективно диагностировать проблемы производительности
-
Оптимизировать использование дискового пространства
-
Прогнозировать поведение системы при нагрузке
-
Осознанно выбирать стратегии хранения данных
PostgreSQL использует страничную организацию данных:
-
Все данные разбиты на страницы (по умолчанию 8 КБ)
-
Каждая страница имеет заголовок и массив элементов (tuple)
-
Файлы данных хранятся в каталоге
base/<OID_базы>/<OID_таблицы>
Ключевые понятия:
-
OID (Object Identifier) - уникальный числовой идентификатор объекта
-
TOAST (The Oversized-Attribute Storage Technique) - механизм хранения больших данных
-
FSM (Free Space Map) - карта свободного места
-
VM (Visibility Map) - карта видимости для VACUUM
Структура файлов данных
-
Основной файл таблицы (
<OID_таблицы>
) -
Файл индекса (
<OID_индекса>
) -
Дополнительные файлы:
-
.fsm
- карта свободного места -
.vm
- карта видимости -
_init
- для UNLOGGED таблиц
-
└──
OID базы данных
├──
Основной файл таблицы (OID таблицы)
├──
Карта свободного места
├──
Карта видимости
└──
Файл индекса
Структура страницы (8 КБ)
-
PageHeader - метаинформация (LSN, checksum, флаги)
-
Item pointers - массив указателей на строки (4 байта каждый)
-
Row data - фактические данные строк (tuple)
-
Special space - служебные данные для индексов
+---------------------+ | PageHeader (24 байт)| +---------------------+ | Item pointers | | (массив указателей) | +---------------------+ | Free space | +---------------------+ | Row data (tuples) | +---------------------+ | Special space | +---------------------+
TOAST-механизм
Для хранения больших значений (> 2 КБ):
-
PLAIN - запрет сжатия (только для небольших типов)
-
EXTENDED (по умолчанию) - сжатие + вынос в TOAST-таблицу
-
EXTERNAL - хранение вне страницы без сжатия
-
MAIN - попытка сжатия, иначе вынос в TOAST
-
Имеет имя
pg_toast_<OID_основной_таблицы>
-
Хранится в отдельном OID пространстве
Системные представления для анализа
pg_class
- информация о таблицах/индексах
pg_relation_filepath
- путь к файлу
pgstattuple
- статистика по страницам
Низкоуровневая организация данных в PostgreSQL — это тщательно продуманная система, которая:
-
Балансирует между производительностью и надежностью
-
Автоматизирует сложные задачи (сжатие, вынос больших данных)
-
Предоставляет инструменты для тонкой настройки (fillfactor, FSM)
Ключевые выводы:
-
Данные организованы в страницы по 8 КБ с четкой структурой
-
TOAST прозрачно решает проблему хранения больших значений
-
Системные каталоги дают полную метаинформацию для анализа
-
Регулярное VACUUM обязательно для поддержания эффективности