sr_plan

Описание

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


Установка

Модуль управления хранением планов запросов в QHB для QHB поставляется в виде пакета qhb-1.5.2-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 (anyelement), например:

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.


См. также

Документация по sr_plan на Github