Низкоуровневая организация данных

Низкоуровневая организация данных — это фундаментальный аспект администрирования PostgreSQL, который раскрывает, как СУБД физически хранит и управляет информацией на диске.
Понимание этой архитектуры позволяет:

  • Эффективно диагностировать проблемы производительности

  • Оптимизировать использование дискового пространства

  • Прогнозировать поведение системы при нагрузке

  • Осознанно выбирать стратегии хранения данных

PostgreSQL использует страничную организацию данных:

  • Все данные разбиты на страницы (по умолчанию 8 КБ)

  • Каждая страница имеет заголовок и массив элементов (tuple)

  • Файлы данных хранятся в каталоге base/<OID_базы>/<OID_таблицы>

Ключевые понятия:

  • OID (Object Identifier) - уникальный числовой идентификатор объекта

  • TOAST (The Oversized-Attribute Storage Technique) - механизм хранения больших данных

  • FSM (Free Space Map) - карта свободного места

  • VM (Visibility Map) - карта видимости для VACUUM


Структура файлов данных

Основные типы файлов:
  1. Основной файл таблицы (<OID_таблицы>)

  2. Файл индекса (<OID_индекса>)

  3. Дополнительные файлы:

    • .fsm - карта свободного места

    • .vm - карта видимости

    • _init - для UNLOGGED таблиц

Пример расположения:
base
└── 16384                 OID базы данных
         ├── 16401         Основной файл таблицы (OID таблицы)
         ├── 16401_fsm  Карта свободного места
         ├── 16401_vm   Карта видимости
         └── 16402         Файл индекса

Структура страницы (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 КБ):

  1. PLAIN - запрет сжатия (только для небольших типов)

  2. EXTENDED (по умолчанию) - сжатие + вынос в TOAST-таблицу

  3. EXTERNAL - хранение вне страницы без сжатия

  4. MAIN - попытка сжатия, иначе вынос в TOAST

TOAST-таблица:
  • Имеет имя pg_toast_<OID_основной_таблицы>

  • Хранится в отдельном OID пространстве


Системные представления для анализа

pg_class - информация о таблицах/индексах
SELECT relname, relfilenode, relpages FROM pg_class WHERE relname = 'your_table';
pg_relation_filepath - путь к файлу
SELECT pg_relation_filepath('your_table');
pgstattuple - статистика по страницам
CREATE EXTENSION pgstattuple; SELECT * FROM pgstattuple('your_table');

Низкоуровневая организация данных в PostgreSQL — это тщательно продуманная система, которая:

  1. Балансирует между производительностью и надежностью

  2. Автоматизирует сложные задачи (сжатие, вынос больших данных)

  3. Предоставляет инструменты для тонкой настройки (fillfactor, FSM)

Ключевые выводы:

  • Данные организованы в страницы по 8 КБ с четкой структурой

  • TOAST прозрачно решает проблему хранения больших значений

  • Системные каталоги дают полную метаинформацию для анализа

  • Регулярное VACUUM обязательно для поддержания эффективности


Комментарии

Добавить комментарий

Чтобы оставить комменатрий необходимо Авторизоваться