Глава 57. Написание метода выборки таблицы#

Глава 57. Написание метода выборки таблицы

Глава 57. Написание метода выборки таблицы

Реализация Tantor BE для оператора TABLESAMPLE поддерживает пользовательские методы выборки из таблицы, в дополнение к методам BERNOULLI и SYSTEM, которые требуются стандартом SQL. Метод выборки определяет, какие строки таблицы будут выбраны при использовании оператора TABLESAMPLE.

На уровне SQL, метод выборки таблицы представлен одной SQL функцией, обычно реализованной на языке C, имеющей сигнатуру

method_name(internal) RETURNS tsm_handler

Имя функции совпадает с именем метода, появляющимся в TABLESAMPLE предложении. Аргумент internal является фиктивным (всегда имеющим значение ноль), который просто предотвращает вызов этой функции непосредственно из SQL-команды. Результатом функции должна быть структура типа TsmRoutine, выделенная с помощью palloc, которая содержит указатели на функции поддержки для метода выборки. Эти функции поддержки являются обычными функциями на языке C и не видимы и не вызываемы на уровне SQL. Функции поддержки описаны в Раздел 57.1.

В дополнение к указателям на функции, структура TsmRoutine должна содержать следующие дополнительные поля:

List *parameterTypes

Это список OID, содержащий OID типа данных параметра(ов), которые будут приниматься в качестве аргументов в TABLESAMPLE при использовании данного метода выборки. Например, для встроенных методов этот список содержит один элемент со значением FLOAT4OID, который представляет процент выборки. Пользовательские методы выборки могут иметь больше или другие параметры.

bool repeatable_across_queries

Если true, метод выборки может предоставлять идентичные выборки при последовательных запросах, если каждый раз предоставляются одни и те же параметры и начальное значение REPEATABLE, и содержимое таблицы не изменилось. Когда это значение false, предложение REPEATABLE не принимается для использования с методом выборки.

bool repeatable_across_scans

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

Тип структуры TsmRoutine объявлен в src/include/access/tsmapi.h, см. для получения дополнительной информации.

Все методы выборки таблиц, включенные в стандартное распределение, являются хорошими ссылками при попытке написать свои собственные. Изучите подкаталог src/backend/access/tablesample исходного дерева для получения сведений о встроенных методах выборки и подкаталог contrib - для дополнительных методов.