Открыть сервис

Страница базы данных

Страница базы данных — это структурный элемент организации хранения данных в системах управления базами данных (СУБД), представляющий собой фиксированный по размеру блок памяти (обычно от 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)

Для обеспечения согласованности данных при сбоях СУБД периодически выполняет контрольные точки — сброс всех изменённых страниц из буферного пула на диск. В этот момент записывается журнал транзакций (WALWrite-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 →