Определение интерфейса метода доступа к таблице

В этой главе описывается интерфейс между основной системой QHB и методами доступа к таблицам (access method), которые управляют хранилищем для таблиц. Основная система мало что знает об этих методах доступа, кроме того, что описано в этой главе. Поэтому можно разработать новые типы методов доступа, написав дополнительный код.

Каждый метод доступа к таблице описывается строкой в системном каталоге pg_am. Запись в pg_am задает имя и функцию-обработчик (handler function) для метода доступа к таблице. Эти записи могут быть созданы и удалены с помощью команд SQL CREATE ACCESS METHOD и DROP ACCESS METHOD.

Функция обработчика метода доступа к таблице должна быть объявлена, чтобы принять один аргумент типа internal и чтобы вернуть псевдо-тип table_am_handler. Аргумент является фиктивным значением, которое необходимо для предотвращения вызова функции непосредственно из команд SQL. Результатом работы функции должен быть указатель на структуру типа TableAmRoutine, который содержит все необходимое для использования метода доступа к таблице. Возвращаемое значение должно иметь время жизни самого сервера, что обычно достигается путем определения его как static const переменной в глобальной области видимости. Структура TableAmRoutine, также называемая API-структурой метода доступа, определяет поведение метода доступа с помощью функций обратного вызовова. Эти обратные вызовы являются указателями на обычные C-функции и не являются видимыми или вызываемыми на уровне SQL. Все обратные вызовы и их поведение определяются в структурe TableAmRoutine (с комментариями внутри структуры, определяющими требования к обратным вызовам). Большинство обратных вызовов имеют оберточные функции, которые документируются для пользователя (а не исполнителя) метода доступа к таблице. Для получения дополнительной информации обратитесь к файлу src/include/access/tableam.h.

Для реализации метода доступа исполнителю, как правило, требуется реализовать определенный для этого метода тип слота таблицы кортежей (см. src/include/executor/tuptable.h), который позволяет реализации иметь ссылки на кортежи метода доступа и получать доступ к столбцам кортежа.

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

Одно довольно большое ограничение API метода доступа к таблице заключается в том, что в настоящее время, если метод доступа хочет поддерживать модификации и/или индексы, то необходимо, чтобы каждый кортеж имел идентификатор кортежа (TID), состоящий из номера блока и номера элемента (см. также раздел Внутренняя структура страницы базы данных). Нет строгой необходимости в том, чтобы части TIDs имели то же значение, которое они, например, имеют для кучи, но если требуется опциональная поддержка битового сканирования, тогда номер блока должен обеспечивать локальность.

Для обработки аварийного завершения метод доступа может использовать WAL или же пользовательские механизмы. Если выбран параметр WAL, можно использовать Общие записи WAL или реализовать новый тип записей WAL. Общие записи WAL просты, но требуют большего объема данных. Реализация нового типа записи WAL в настоящее время требует внесения изменений в основной код (в частности, src/include/access/rmgrlist.h).

Для реализации транзакционной поддержки таким образом, чтобы различные методы доступа к таблицам были доступны в рамках одной транзакции, вероятно, необходимо тесно интегрироваться с механизмом в src/backend/access/transam/xlog.c.

Любой разработчик нового способа доступа к таблице может обратиться к существующей реализации кучи, которая находится в src/backend/access/heap/ heapam_handler.c.