Перейти к основному содержимому

Составление метода выборки таблицы

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

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

method_name(internal) RETURNS tsm_handler

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

Помимо указателей функций, структура 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 для дополнительных методов.