Страница базы данных
Страница базы данных — это структурный элемент организации хранения данных в системах управления базами данных (СУБД), представляющий собой фиксированный по размеру блок памяти (обычно от 2 до 64 Кбайт), который является минимальной единицей обмена данными между оперативной памятью и дисковым хранилищем. Страницы используются для хранения записей таблиц, индексов, метаданных и служебной информации, обеспечивая эффективное управление вводом-выводом и кэширование данных.
История и развитие
Концепция страничной организации данных восходит к ранним операционным системам и системам управления файлами, где для оптимизации работы с медленными дисковыми накопителями применялась блочная адресация. В 1960-х годах, с появлением реляционных СУБД (например, System R от IBM), возникла необходимость в унифицированном формате хранения записей внутри блоков. Первые коммерческие СУБД, такие как Oracle (1979) и DB2 (1983), использовали страницы размером 2–4 Кбайт. В 1990-х годах, с ростом объёмов данных и ёмкости дисков, размер страницы увеличился до 8–16 Кбайт в большинстве современных СУБД (PostgreSQL, MySQL InnoDB, Microsoft SQL Server). В 2000-х годах, с развитием SSD-накопителей и колоночных СУБД (например, ClickHouse), появились гибридные подходы, где страницы могут быть переменного размера или заменяться более крупными блоками (например, 64 Кбайт).
Устройство и структура
Каждая страница базы данных имеет стандартную внутреннюю структуру, которая может незначительно варьироваться в зависимости от СУБД, но в общем случае включает:
- Заголовок страницы — фиксированная область (обычно 24–128 байт), содержащая служебную информацию: номер страницы, тип страницы (данные, индекс, свободное пространство, метаданные), контрольную сумму, указатели на соседние страницы (для связных списков), количество записей, указатель на начало свободного пространства.
- Область данных — основная часть, где хранятся записи таблиц или индексные записи. Записи могут располагаться последовательно (слоты) или в виде связанных списков.
- Свободное пространство — неиспользуемая область, которая может быть занята при вставке новых записей или обновлении существующих. Размер свободного пространства отслеживается в заголовке.
- Специальные области — в некоторых СУБД (например, SQL Server) страницы содержат массив слотов (slot array), который указывает на начало каждой записи, что позволяет быстро перемещать записи внутри страницы без изменения индексов.
Типы страниц
В зависимости от назначения выделяют:
- Страницы данных — хранят строки таблиц (записи). В реляционных СУБД записи обычно располагаются в порядке вставки или в порядке кластеризованного индекса.
- Индексные страницы — содержат ключи и указатели на записи (или на другие страницы). В B-деревьях (например, в PostgreSQL) индексные страницы организованы в виде узлов: внутренние узлы содержат диапазоны ключей, листовые — ссылки на страницы данных.
- Страницы свободного пространства — используются для отслеживания пустых страниц, которые можно переиспользовать при вставке новых данных.
- Страницы метаданных — хранят информацию о структуре базы данных (схемы, таблицы, индексы, права доступа). Например, в MySQL InnoDB страницы типа «FSP_HDR» и «IBUF_BITMAP» управляют распределением пространства.
- Страницы отката (undo/rollback) — в СУБД с поддержкой транзакций (например, Oracle, PostgreSQL) хранят старые версии записей для обеспечения изоляции и отката изменений.
Управление страницами
Буферный пул
СУБД использует буферный пул (кэш страниц) — область оперативной памяти, где хранятся копии наиболее часто используемых страниц. Размер буферного пула обычно составляет 10–80% от доступной RAM. При чтении данных СУБД сначала проверяет, есть ли нужная страница в буферном пуле; если нет — выполняется дисковый ввод-вывод. При записи изменения сначала вносятся в копию страницы в буферном пуле, а затем периодически сбрасываются на диск (через механизм контрольных точек). В PostgreSQL буферный пул управляется через shared_buffers, в MySQL InnoDB — через innodb_buffer_pool_size.
Фрагментация и дефрагментация
Со временем страницы могут фрагментироваться: при удалении записей остаются пустые места, при обновлении записей (если новая версия не помещается в старую страницу) записи перемещаются на другие страницы, оставляя «дыры». Фрагментация снижает эффективность использования пространства и увеличивает количество операций ввода-вывода. Для борьбы с фрагментацией применяются:
- Автоматическая дефрагментация — в некоторых СУБД (например, SQL Server) фоновый процесс перестраивает страницы, уплотняя записи.
- Ручная дефрагментация — через команды REINDEX (PostgreSQL), OPTIMIZE TABLE (MySQL), ALTER INDEX REBUILD (SQL Server).
- Плавающие страницы — в PostgreSQL страницы, ставшие пустыми, помечаются как свободные и могут быть переиспользованы.
Контрольные точки (Checkpoints)
Для обеспечения согласованности данных при сбоях СУБД периодически выполняет контрольные точки — сброс всех изменённых страниц из буферного пула на диск. В этот момент записывается журнал транзакций (WAL — Write-Ahead Log), что позволяет восстановить данные до последней контрольной точки. Частота контрольных точек настраивается (например, в PostgreSQL через checkpoint_timeout и max_wal_size).
Размер страницы
Размер страницы является критическим параметром, влияющим на производительность. Основные компромиссы:
- Малый размер (2–4 Кбайт) — уменьшает потери при хранении мелких записей, но увеличивает количество операций ввода-вывода при последовательном сканировании больших таблиц. Используется в старых СУБД (Oracle 7, DB2).
- Средний размер (8–16 Кбайт) — стандарт для большинства современных реляционных СУБД (PostgreSQL — 8 Кбайт, MySQL InnoDB — 16 Кбайт, SQL Server — 8 Кбайт). Обеспечивает баланс между производительностью и эффективностью использования пространства.
- Большой размер (32–64 Кбайт) — применяется в аналитических и колоночных СУБД (ClickHouse, Vertica), где данные сжимаются и читаются крупными блоками. Уменьшает накладные расходы на ввод-вывод, но увеличивает задержки при случайном доступе.
В некоторых СУБД (например, Oracle) размер страницы задаётся при создании базы данных и не может быть изменён без пересоздания. В других (PostgreSQL) размер страницы фиксирован (8 Кбайт) и не настраивается.
Применение в различных СУБД
PostgreSQL
Использует страницы фиксированного размера 8 Кбайт. Каждая страница имеет заголовок (24 байта), массив указателей на записи (item pointers) и область данных. Записи хранятся в виде кортежей (tuple), каждый из которых содержит заголовок (23 байта) и данные. Для поддержки MVCC (Multi-Version Concurrency Control) старые версии записей могут оставаться на странице до очистки (vacuum). В PostgreSQL страницы также используются для хранения индексов (B-деревья, GiST, GIN).
MySQL InnoDB
Размер страницы по умолчанию — 16 Кбайт (может быть изменён при создании табличного пространства). Страница состоит из заголовка (38 байт), массива слотов (2 байта на запись) и области данных. InnoDB использует страницы для хранения строк таблиц (кластеризованный индекс по первичному ключу) и вторичных индексов. Для управления свободным пространством применяется битовая карта (page directory).
Microsoft SQL Server
Размер страницы — 8 Кбайт. Заголовок страницы занимает 96 байт, содержит номер страницы, тип, контрольную сумму и указатели. Данные хранятся в виде строк (row) с фиксированной или переменной длиной. SQL Server использует страницы для хранения таблиц (кучи или кластеризованные индексы), индексов (B-деревья) и служебных структур (например, страницы IAM — Index Allocation Map).
Интересные факты
- В PostgreSQL существует механизм «TOAST» (The Oversized-Attribute Storage Technique), который позволяет хранить большие значения (более 2 Кбайт) на отдельных страницах, сжимая их или разбивая на фрагменты.
- В MySQL InnoDB страницы могут быть «сжатыми» (compressed page) — при включении сжатия таблиц (ROW_FORMAT=COMPRESSED) страницы хранятся в сжатом виде, что экономит дисковое пространство, но увеличивает нагрузку на процессор.
- В SQL Server существует тип страницы «BLOB» (Binary Large Object), который используется для хранения больших объектов (текст, изображения) размером до 2 Гбайт.
- В некоторых СУБД (например, Oracle) страницы называются «блоками» (block), а не страницами, но принцип организации аналогичен.
Источники
- PostgreSQL Documentation: Chapter 63. Database Page Layout
- MySQL InnoDB Internals: InnoDB Page Structure
- Microsoft SQL Server Documentation: Pages and Extents
- Ramakrishnan R., Gehrke J. «Database Management Systems» (3rd ed.), Chapter 9: Storage and Indexing
- Silberschatz A., Korth H. F., Sudarshan S. «Database System Concepts» (7th ed.), Chapter 10: Storage and File Structure
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →