Глава 60. Написание метода извлечения выборки таблицы
Реализация предложения TABLESAMPLE
в PostgreSQL поддерживает подключение собственных методов извлечения выборки таблицы в дополнение к методам BERNOULLI
и SYSTEM
, которые требуются стандартом SQL. Метод выборки определяет, какие строки таблицы будут выбираться, когда используется предложение TABLESAMPLE
.
На уровне SQL метод извлечения выборки таблицы представляется одной функцией SQL, обычно реализуемой на C, имеющей сигнатуру
method_name(internal) RETURNS tsm_handler
Имя функции будет совпадать с именем метода, указываемым в предложении TABLESAMPLE
. Аргумент internal
является фиктивным (в нём всегда передаётся ноль) и введён только для того, чтобы эту функцию нельзя было вызывать напрямую из команд SQL. Возвращать эта функция должна структуру типа TsmRoutine
(выделенную вызовом palloc), содержащую указатели на опорные функции для метода извлечения выборки. Эти опорные функции представляют собой простые функции на C, которые не видны и не могут вызываться на уровне SQL. Эти опорные функции описаны в Разделе 60.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
.