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.