Структура файла таблицы HEAP PostgreSQL
Файл данных (heap - таблицы, карты свободного пространства и карты видимости) разделен на страницы (или блоки) фиксированной длины, которая по умолчанию составляет 8192 байта (8 КБ). Страницы в каждом файле пронумерованы, начиная с 0, эти номера называются номерами блоков. Если файл переполнен, PostgreSQL добавляет новую пустую страницу в конец файла для того, чтобы увеличить его размер.
Внутренняя структура страниц зависит от типа файла данных. В этом разделе описывается структура таблиц, поскольку эта информация потребуется в следующих главах.
Страница в таблице содержит три типа данных:
-
Кортеж - это основной строительный блок реляционных баз данных, представляющий собой упорядоченные элементы данных или записи в таблице. Кортежи обеспечивают эффективную организацию, хранение и поиск многомерных данных, играя важную роль в современной разработке ПО.
Внутренняя структура кортежа подробно описана в Разделах 5.2 и 9, поскольку данная тема подразумевает глубокие знания в области механизма управления параллельным доступом к данным (CC), а также журналов предзаписи (WAL) в PostgreSQL.
- Указатель на строку – Это переменная, которая содержит адрес области данных (переменной/структуры/объекта/функции и т.п.) в памяти микроконтроллера, точнее – его самого первого блока, байта. Зная адрес первого байта в блоке данных, можно получить контроль над данными по этому адресу, но нужно знать размер этого блока. Поэтому при создании указателя мы указываем, на какой тип данных он указывает, это может быть любой тип данных. Длина указателя составляет 4 байта.
Указатели строк образуют простой массив, который играет роль индекса к кортежам. Каждый указатель пронумерован, начиная с 1. Когда на страницу добавляется новый кортеж, в массив также помещается новый указатель на строку, указывающий на этот кортеж.
-
Данные заголовка страницы – содержат общую информацию о странице, включая указатели свободного пространства. Первые 24 байта каждой страницы образуют заголовок страницы (PageHeaderData).
Данные заголовка страницы описаны ниже:
PageHeaderData
typedef struct PageHeaderData @src/include/storage/bufpage.h
{
/* XXX LSN is member of *any* block, not only page-organized ones */
PageXLogRecPtr pd_lsn; /* LSN: next byte after last byte of xlog
* record for last change to this page */
uint16 pd_checksum; /* checksum */
uint16 pd_flags; /* flag bits, see below */
LocationIndex pd_lower; /* offset to start of free space */
LocationIndex pd_upper; /* offset to end of free space */
LocationIndex pd_special; /* offset to start of special space */
uint16 pd_pagesize_version;
TransactionId pd_prune_xid;/* oldest prunable XID, or zero if none */
ItemIdData pd_linp[1]; /* beginning of line pointer array */
} PageHeaderData;
typedef PageHeaderData *PageHeader;
typedef uint64 XLogRecPtr;
- pd_lsn – данный тип данных применяется для хранения значения LSN (последовательный номер в журнале, Log Sequence Number), которое представляет собой указатель на позицию в журнале WAL. Этот тип содержит XLogRecPtr и является внутренним системным типом PostgreSQL . Длина данного типа данных составляет 8 байт. Более подробная информация по данной теме предоставлена в подразделе 9.1.
-
pd_checksum – данный тип данных содержит контрольную сумму страницы. Обратите внимание, что эта переменная доступна в версиях 9.3 и новее.
- pd_lower, pd_upper – pd_lower указывает на смещение до начала свободного пространства, pd_upper – на смещение до конца свободного пространства;
- pd_special – переменная, предназначенная для индексов, указывает на смещение до начала специального пространства.
Пространство между концом указателей строк и началом нового кортежа называется свободным пространством.
Для определения кортежа в рамках таблицы используется идентификатор кортежа (Tuple Identifier или TID) . Он указывает на физическое положение конкретной версии строки. TID занимает 6 байт и состоит из номера блока (страницы) и номера строки внутри блока. Более подробная информация представлена в подразделе 1.4.
Примечание: структура PageHeaderData описана в src/include/storage/bufpage.h.
Примечание: хранение сложных типов данных, особенно тех, значения которых могут быть очень большого размера – непростая задача. В PostgreSQL физический размер одной записи таблицы не может превышать размер страницы (по умолчанию – 8 кб). Каждая строка должна помещаться целиком на одну страницу: нет способа «продолжить» строку на следующей странице. Для длинных строк используется технология, названная TOAST (The Oversized Attributes Storage Technique). Для получения более детальной информации рекомендуем обратиться к оффициальной документации PostgreSQL.




