sr_plan - Модуль управления хранением планов запросов в QHB

Модуль sr_plan выглядит как система Oracle Outline. Его можно использовать для блокировки плана выполнения. Это необходимо, если есть сомнения в планировщике или не возможно составить лучший план.

Установка

Модуль управления хранением планов запросов в QHB для QHB поставляется в виде пакета qhb-1.5.1-sr-plan.

Подключите репозиторий пакетов QHB и установите пакет расширения для выбранной платформы со страницы загрузки.

Применение

Установка расширения в базу данных:

CREATE EXTENSION sr_plan;

Если требуется сохранить план запроса, то необходимо установить переменную:

set sr_plan.write_mode = true;

Теперь планы для всех последующих запросов будут храниться в таблице sr_plans. При этом все запросы будут сохранены, включая дубликаты.

Формирование примера запроса:

select query_hash from sr_plans where query_hash=10;

Отключение сохранения плана для запроса:

set sr_plan.write_mode = false;

Включение плана:

update sr_plans set enable=true;

После этого план запроса будет взят из файла sr_plans.

Кроме того, sr_plans позволяет сохранять параметризованный план запроса. При этом некоторые константы в запросе не существенны. Для параметров используется специальная функция _p (любой элемент) пример:

select query_hash from sr_plans where query_hash=1000+_p(10);

Можно сохранить план для запроса и разрешить его использовать также для следующих запросов:

select query_hash from sr_plans where query_hash=1000+_p(11); select query_hash from sr_plans where query_hash=1000+_p(-5);

EXPLAIN для сохраненных планов

С помощью функции show_plan можно просмотреть сохраненные планы. Это требует знания хеша запроса, который можно получить из таблицы sr_plans.

Примеры:

Показать включенный план для хеша запроса:

SELECT show_plan(1); show_plan ---------------------------------------------- ("Seq Scan on public.explain_test") (" Output: test_attr1, test_attr2") (" Filter: (explain_test.test_attr1 = 10)") (3 rows)

Получите второй сохраненный план, используя параметр index (игнорирует атрибут enable ):

SELECT show_plan(1, index := 2); show_plan ---------------------------------------------- ("Seq Scan on public.explain_test") (" Output: test_attr1, test_attr2") (" Filter: (explain_test.test_attr1 = 10)") (3 rows)

Используйте другой выходной формат (поддерживаются форматы json, text, xml, yaml):

SELECT show_plan(1, format := 'json'); show_plan ------------------------------------------------------ ("[ + { + ""Plan"": { + ""Node Type"": ""Seq Scan"", + ""Parallel Aware"": false, + ""Relation Name"": ""explain_test"", + ""Schema"": ""public"", + ""Alias"": ""explain_test"", + ""Output"": [""test_attr1"", ""test_attr2""], + ""Filter"": ""(explain_test.test_attr1 = 10)""+ } + } + ]") (1 row)

pg_stat_statements интеграция

Таблица sr_plans содержит столбцы query_id, которые можно использовать для соединений с таблицами и представлениями pg_stat_statements.

Примечание: в shared_preload_libraries списке pg_stat_statements следует указывать после sr_plan.

См. также