×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

7.15.6. Структура страниц базы данных

7.15.6.1. Структура строк таблицы

В данном разделе приводится обзор формата страниц, используемого в Digital Q.DataBase таблицах и индексах.[16] Последовательности и TOAST таблицы форматируются так же, как обычные таблицы.

В следующем пояснении под термином байт понимается совокупность из 8 бит. Кроме того, термин элемент означает отдельное значение данных, хранящееся на странице. В таблице элемент — это строка; в индексе элемент — это запись индекса.

Каждая таблица и индекс хранятся в виде массива страниц фиксированного размера (обычно 8 КБ, хотя при компиляции сервера может быть выбран другой размер страницы). В таблице все страницы логически эквивалентны, поэтому конкретный элемент (строка) может храниться на любой странице. В индексах первая страница обычно резервируется как метастраница , содержащая управляющую информацию; при этом в индексе могут присутствовать страницы разных типов в зависимости от метода доступа к индексу.

Таблица 7.15.2 показана общая структура страницы. Каждая страница состоит из пяти частей.

Таблица 7.15.2. Общая структура страницы

Элемент Описание
PageHeaderDataДлина составляет 24 байта. Содержит общую информацию о странице, включая указатели на свободное пространство.
ItemIdDataМассив идентификаторов элементов, указывающих на фактические элементы. Каждая запись представляет собой пару (offset, length). По 4 байта на каждый элемент.
Свободное пространствоНераспределённое пространство. Новые идентификаторы элементов выделяются из начала этой области, а новые элементы — из конца.
ЭлементыНепосредственно сами элементы.
Специальное пространствоДанные, специфичные для метода доступа к индексу. Различные методы хранят разные данные. В обычных таблицах данная область пуста.

Первые 24 байта каждой страницы занимает заголовок страницы (PageHeaderData). Его формат подробно описан в Таблица 7.15.3. Первое поле отслеживает самую последнюю запись WAL, относящуюся к данной странице. Второе поле содержит контрольную сумму страницы, если data checksums включены. Далее следует 2-байтовое поле, содержащее битовые флаги. За ним следуют три 2-байтовых целочисленных поля (pd_lower, pd_upper, и pd_special). Данные поля содержат смещения в байтах от начала страницы до начала нераспределённого пространства, до конца нераспределённого пространства и до начала специального пространства. Следующие 2 байта заголовка страницы, pd_pagesize_version, содержат как размер страницы, так и индикатор версии. Начиная с Digital Q.DataBase 8.3 номер версии — 4; Digital Q.DataBase 8.1 и 8.2 использовалась версия номер 3; Digital Q.DataBase 8.0 использовалась версия номер 2; Digital Q.DataBase 7.3 и 7.4 использовалась версия номер 1; в предыдущих выпусках использовался номер версии 0. (Базовая структура страницы и формат заголовка не менялись в большинстве этих версий, однако изменилась структура заголовков строк кучи.) Размер страницы указан в основном для перекрёстной проверки; В рамках одной установки не поддерживается использование более чем одного размера страницы. Последнее поле является подсказкой, указывающей на вероятную целесообразность очистки страницы: оно отслеживает старейшее значение XMAX на странице, для которого еще не выполнялась очистка.

Таблица 7.15.3. Структура PageHeaderData

ПолеТипДлинаОписание
pd_lsnPageXLogRecPtr8 байтLSN: следующий байт после последнего байта записи WAL для последнего изменения данной страницы
pd_checksumuint162 байтаКонтрольная сумма страницы
pd_flagsuint162 байтаБитовые флаги
pd_lowerLocationIndex2 байтаСмещение до начала свободного пространства
pd_upperLocationIndex2 байтаСмещение до конца свободного пространства
pd_specialLocationIndex2 байтаСмещение до начала специальной области
pd_pagesize_versionuint162 байтаИнформация о размере страницы и номере версии структуры
pd_prune_xidTransactionId4 байтаСтарейшее невычищенное значение XMAX на странице или ноль при его отсутствии

Подробную информацию можно найти в файле src/include/storage/bufpage.h.

За заголовком страницы следуют идентификаторы элементов (ItemIdData), каждый из которых занимает четыре байта. Идентификатор элемента содержит смещение в байтах относительно начала элемента, его длину в байтах и несколько битов атрибутов, определяющих его интерпретацию. Новые идентификаторы элементов выделяются по мере необходимости из начала нераспределённого пространства. Количество существующих идентификаторов элементов можно определить по значению pd_lower, которое увеличивается для выделения каждого нового идентификатора. Поскольку идентификатор элемента остается неподвижным до момента его освобождения, его индекс может использоваться для долговременной ссылки на элемент, даже если сам элемент перемещается в пределах страницы в процессе уплотнения свободного пространства. Фактически, любой указатель на элемент (ItemPointer, также известный как CTID) созданный Digital Q.DataBase состоит из номера страницы и индекса идентификатора элемента.

Сами элементы хранятся в пространстве, выделяемом в обратном порядке от конца нераспределённого пространства. Точная структура варьируется в зависимости от того, что именно должна содержать таблица. Как для таблиц, так и для последовательностей используется структура с именем HeapTupleHeaderData, описание которой приведено ниже.

Последним разделом является «специальный раздел» который может содержать любые данные по усмотрению метода доступа. Например, в индексах типа b-tree хранятся ссылки на левую и правую соседние страницы, а также другие данные, относящиеся к структуре индекса. В обычных таблицах специальный раздел не используется вовсе (на что указывает установка значения pd_special равным размеру страницы).

Рисунок 7.15.1 иллюстрирует схему размещения этих частей на странице.

Рисунок 7.15.1. Структура страницы


7.15.6.1. Структура строк таблицы #

Все строки таблицы структурированы одинаково. Заголовок имеет фиксированный размер (23 байта на большинстве архитектур), за ним следуют необязательная битовая карта NULL, необязательное поле идентификатора объекта и пользовательские данные. Структура заголовка подробно описана в Таблица 7.15.4. Непосредственно пользовательские данные (столбцы строки) начинаются со смещения, определяемого t_hoff, которое всегда должно быть кратно значению выравнивание MAXALIGN для данной платформы. Битовая карта NULL-значений присутствует только в том случае, если HEAP_HASNULL бит установлен в t_infomask. При наличии она располагается сразу после фиксированного заголовка и занимает количество байтов, достаточное для хранения одного бита на каждый столбец данных (то есть число бит, соответствующее количеству атрибутов в t_infomask2). В данном списке битов значение 1 указывает на отсутствие NULL (not-null), а значение 0 — на наличие NULL. Если битовая карта отсутствует, считается, что все столбцы не содержат NULL. Идентификатор объекта присутствует только в том случае, если HEAP_HASOID_OLD бит установлен в t_infomask. При наличии этот элемент располагается непосредственно перед t_hoff границей. Любое заполнение, необходимое для того, чтобы сделать t_hoff значение кратным выравнивание MAXALIGN, будет добавлено между битовой картой NULL-значений и идентификатором объекта. (Это, в свою очередь, обеспечивает надлежащее выравнивание идентификатора объекта.)

Таблица 7.15.4. Структура HeapTupleHeaderData

ПолеТипДлинаОписание
t_xminTransactionId4 байтаметка XID вставки
t_xmaxTransactionId4 байтаметка XID удаления
t_cidCommandId4 байтаметка CID вставки и/или удаления (совмещена с t_xvac)
t_xvacTransactionId4 байтаидентификатор XID для операции VACUUM, перемещающей версию строки
t_ctidItemPointerData6 байттекущий идентификатор TID этой или более новой версии строки
t_infomask2uint162 байтаколичество атрибутов, а также различные битовые флаги
t_infomaskuint162 байтаразличные битовые флаги
t_hoffuint81 байтсмещение до пользовательских данных

Подробная информация приведена в файле src/include/access/htup_details.h.

Интерпретация фактических данных возможна только с помощью информации, полученной из других таблиц, в основном из pg_attribute. Ключевыми значениями, необходимыми для определения местоположения полей, являются attlen и attalign. Прямой доступ к конкретному атрибуту невозможен, за исключением случаев, когда запись содержит только поля фиксированной длины и не содержит значений NULL. Вся эта механика инкапсулирована в функциях heap_getattr, fastgetattr и heap_getsysattr.

Для чтения данных необходимо последовательно обработать каждый атрибут. Сначала следует проверить, является ли поле пустым (NULL) в соответствии с битовой картой значений NULL. Если это так, переходите к следующему. Затем необходимо обеспечить правильное выравнивание. Если поле имеет фиксированную ширину, то все байты просто размещаются. Если это поле переменной длины (attlen = -1), реализация усложняется. Все типы данных переменной длины используют общую структуру заголовка структура varlena, которая содержит общую длину хранимого значения и несколько битов флагов. В зависимости от флагов, данные могут располагаться либо внутри строки, либо в TOAST таблица; она также может быть сжата (см. Раздел 7.15.2).



[16] Фактически использование данного формата страниц не является обязательным для методов доступа ни к таблицам, ни к индексам. heap метод доступа к таблицам всегда использует этот формат. Все существующие методы индексирования также используют базовый формат, однако данные, хранящиеся на метастраницах индексов, обычно не следуют правилам размещения элементов.

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению