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

Функции изменения плана выполнения запросов

Функции, представленные в данном разделе, реализованы в рамках поставляемого расширения pg_outline для изменения плана выполнения запросов.

Примечание

Для функций, у которых в качестве первого параметра передаетсяqueryId BIGINT, имеется перегруженный вариант с первым параметром queryText TEXT вместо queryId. Такие функции используют метод outline.identify для преобразования переданного queryText в queryId.

outline.set_hint()

Добавляет или меняет подсказки (hint) для плана запроса с идентификатором queryId на указанные в подсказке.

Синтаксис:

outline.set_hint(
queryId BIGINT,
hint TEXT,
applicationName TEXT DEFAULT '',
active BOOL DEFAULT TRUE
) RETURNS VOID

Входные параметры:

Название параметраТип значенияОписание
queryIdbigintИдентификатор запроса, который нужно подменить
hinttextПодсказка для плана запроса. В параметре не требуется указывать начало и окончание подсказок ('/*'+ и '*/')
applicationNametextИмя приложения сессии (application_name), к которому применимо данное правило. Если значение является пустой строкой, то правило применимо для всех сессий
activeboolДанный параметр позволяет указать состояние правила (true - включено, false - выключено). Выключенные правила не действуют при подмене

Возвращаемое значение:

Отсутствует. В случае успешного выполнения функция вернет пустое значение.

Пример использования:

SELECT outline.set_hint( 8780796351443046209, 'SeqScan(table2)' );

outline.get()

Возвращает информацию о созданных правилах подмены планов запросов.

Синтаксис:

outline.get(
queryId BIGINT DEFAULT NULL,
applicationName TEXT DEFAULT NULL,
OUT queryId BIGINT,
OUT plan TEXT,
OUT outline TEXT,
OUT applicationName TEXT,
OUT active BOOL
) RETURNS SETOF record

Входные параметры:

Название параметраТип значенияОписание
queryIdbigintИдентификатор запроса
applicationNametextИмя приложения сессии (application_name)

Опционально функция принимает два параметра-фильтра queryId и applicationName, если параметры:

  • не равны NULL – будут возвращены только те записи, значения параметров которых равны переданному параметру (или параметрам по принципу «и»);
  • равны NULL – будут возвращены все установленные подмены.

Возвращаемые значения:

Название поляТип значенияОписание
queryIdbigintИдентификатор запроса
plantextПлан запроса
outlinetextВ поле «outline» помещается текст подменяющего запроса. Если используется режим подмены запроса с подсказками, то в поле будут помещены подсказки с префиксом "/*+ " и суффиксом " */", если используется режим полной подмены, то в поле будет помещен текст нового запроса, в том числе с подсказками (hint), если они были указаны при задании подмены
applicationNametextИмя приложения сессии (application_name), к которому применимо данное правило. Если значение является пустой строкой, то правило применимо для всех сессий
activeboolПараметр состояния правила (true - включено, false - выключено). Выключенные правила не действуют при подмене

Пример использования:

SELECT outline.get();

Пример вывода:

                           get                           
----------------------------------------------------------
(-1534470949533653502,"","Sort +
Sort Key: f1 +
-> Seq Scan on table1 +
Filter: ((f1 = (100 + $1)) OR (f1 = (110 + $2)))+
","SELECT * +
FROM table1 +
WHERE f1 = 100+$1 or f1 = 110+$2 +
ORDER BY f1",t)
(1 row)

outline.delete()

Удаляет правило (если существует) с идентификатором запроса queryId и именем приложения applicationName.

Синтаксис:

outline.delete(
queryId BIGINT,
applicationName TEXT DEFAULT ''
) RETURNS VOID

Входные параметры:

Название параметраТип значенияОписание
queryIdbigintИдентификатор запроса, который нужно подменить
applicationNametextИмя приложения сессии (application_name), к которому применимо данное правило. Если значение является пустой строкой, то правило применимо для всех сессий
Внимание!

Если в качестве любого аргумента передать значение NULL, то функция outline.delete удалит записи независимо от совпадения данного аргумента.

Пример:

  • outline.delete(NULL,NULL) – удалить все записи;
  • outline.delete(123,NULL) – удалить подмену для query_id=123 для всех фильтров сессий;
  • outline.delete(NULL,'myapp') – удалить все подмены с установленным фильтром сессий 'myapp'.

Возвращаемое значение:

Отсутствует. В случае успешного выполнения функция вернет пустое значение.

Пример использования:

SELECT outline.delete();

outline.activate()

Включает правило с идентификатором запроса queryId и именем приложения applicationName.

Синтаксис:

outline.activate(
queryId BIGINT,
applicationName TEXT DEFAULT ''
) RETURNS VOID

Входные параметры:

Название параметраТип значенияОписание
queryIdbigintИдентификатор запроса, который нужно подменить
applicationNametextИмя приложения сессии (application_name), к которому применимо данное правило. Если значение является пустой строкой, то правило применимо для всех сессий

Возвращаемое значение:

Отсутствует. В случае успешного выполнения функция вернет пустое значение.

Пример использования:

SELECT outline.activate(
'SELECT f1 FROM table1 WHERE f1 < 150 ORDER BY f1 limit 2',
'' );

outline.deactivate()

Выключает правило с идентификатором запроса queryId и именем приложения applicationName.

Синтаксис:

outline.deactivate(
queryId BIGINT,
applicationName TEXT DEFAULT ''
) RETURNS VOID

Входные параметры:

Название параметраТип значенияОписание
queryIdbigintИдентификатор запроса, который нужно подменить
applicationNametextИмя приложения сессии (application_name), к которому применимо данное правило. Если значение является пустой строкой, то правило применимо для всех сессий

Возвращаемое значение:

Отсутствует. В случае успешного выполнения функция вернет пустое значение.

Пример использования:

SELECT outline.deactivate(
'SELECT f1 FROM table1 WHERE f1 < 150 ORDER BY f1 limit 2',
'' );

outline.identify()

Возвращает идентификатор запроса queryId для текста запроса queryText. Используется для сопоставления выполняемого запроса и правила фиксации/подмены этого запроса.

Синтаксис:

outline.identify(
queryText TEXT
) RETURNS BIGINT

Входные параметры:

Название параметраТип значенияОписание
queryTexttextТекст запроса
Примечание

В тексте запроса (queryText) обязательно укажите значения всех констант. Это необходимо для определения типа данных этих констант (само значение констант неважно).

Возвращаемое значение:

В результате будет выведен идентификатор запроса для заданного текста запроса. Идентификатор — это целое положительное или отрицательное число.

Пример использования:

SELECT outline.identify( 'SELECT * FROM mytable WHERE x=10;' );