Функции изменения плана выполнения запросов
Функции, представленные в данном разделе, реализованы в рамках поставляемого расширения 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
Входные параметры:
| Название параметра | Тип значения | Описание |
|---|---|---|
queryId | bigint | Идентификатор запроса, который нужно подменить |
hint | text | Подсказка для плана запроса. В параметре не требуется указывать начало и окончание подсказок ('/*'+ и '*/') |
applicationName | text | Имя приложения сессии (application_name), к которому применимо данное правило. Если значение является пустой строкой, то правило применимо для всех сессий |
active | bool | Данный параметр позволяет указать состояние правила (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
Входные параметры:
| Название параметра | Тип значения | Описание |
|---|---|---|
queryId | bigint | Идентификатор запроса |
applicationName | text | Имя приложения сессии (application_name) |
Опционально функция принимает два параметра-фильтра queryId и applicationName, если параметры:
- не равны
NULL– будут возвращены только те записи, значения параметров которых равны переданному параметру (или параметрам по принципу «и»); - равны
NULL– будут возвращены все установленные подмены.
Возвращаемые значения:
| Название поля | Тип значения | Описание |
|---|---|---|
queryId | bigint | Идентификатор запроса |
plan | text | План запроса |
outline | text | В поле «outline» помещается текст подменяющего запроса. Если используется режим подмены запроса с подсказками, то в поле будут помещены подсказки с префиксом "/*+ " и суффиксом " */", если используется режим полной подмены, то в поле будет помещен текст нового запроса, в том числе с подсказками (hint), если они были указаны при задании подмены |
applicationName | text | Имя приложения сессии (application_name), к которому применимо данное правило. Если значение является пустой строкой, то правило применимо для всех сессий |
active | bool | Параметр состояния правила (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
Входные параметры:
| Название параметра | Тип значения | Описание |
|---|---|---|
queryId | bigint | Идентификатор запроса, который нужно подменить |
applicationName | text | Имя приложения сессии (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
Входные параметры:
| Название параметра | Тип значения | Описание |
|---|---|---|
queryId | bigint | Идентификатор запроса, который нужно подменить |
applicationName | text | Имя приложения сессии (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
Входные параметры:
| Название параметра | Тип значения | Описание |
|---|---|---|
queryId | bigint | Идентификатор запроса, который нужно подменить |
applicationName | text | Имя приложения сессии (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
Входные параметры:
| Название параметра | Тип значения | Описание |
|---|---|---|
queryText | text | Текст запроса |
В тексте запроса (queryText) обязательно укажите значения всех констант. Это необходимо для определения типа данных этих констант (само значение констант неважно).
Возвращаемое значение:
В результате будет выведен идентификатор запроса для заданного текста запроса. Идентификатор — это целое положительное или отрицательное число.
Пример использования:
SELECT outline.identify( 'SELECT * FROM mytable WHERE x=10;' );