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

auto_explain. Автопротоколирование планов выполнения медленных операторов

В исходном дистрибутиве установлено по умолчанию: да.

Связанные компоненты: отсутствуют.

Схема размещения: не используется.

Модуль auto_explain предоставляет возможность автоматического протоколирования планов выполнения медленных операторов, что позволяет обойтись без выполнения EXPLAIN вручную. Возможно применение для выявления неоптимизированных запросов в больших приложениях.

Протокол выводится в текущий журнал работы СУБД. Журналы расположены в каталоге, который указан в параметре СУБД log_directory.

Ниже приведены параметры конфигурации, которые управляют поведением auto_explain. Поведение по умолчанию сводится к бездействию, поэтому необходимо установить как минимум переменную auto_explain.log_min_duration задается, если необходимо получить какие-либо результаты.

Все параметры могут изменять только суперпользователи.

ПараметрТип значенияЗначение по умолчаниюОписание
auto_explain.log_min_durationinteger-1 – отключенВремя выполнения оператора в миллисекундах; при превышении указанного времени план оператора будет протоколироваться;
0 – протоколируются все планы;
-1 – протоколирование планов отключается
auto_explain.log_analyzebooleanfalse – отключенПри включении параметра в протокол будет записываться вывод команды EXPLAIN ANALYZE (не просто EXPLAIN); замер времени на уровне узлов плана производится для всех операторов, даже если они выполняются недостаточно долго для протоколирования. Это может оказать негативное влияние на производительность; отключение auto_explain.log_timing исключает это влияние, при этом собирается меньше информации
auto_explain.log_buffersbooleanfalse – отключенОпределяет вывод статистики об использовании буферов при протоколировании плана; параметр равнозначен указанию BUFFERS команды EXPLAIN и действует при включенном параметре auto_explain.log_analyze
auto_explain.log_walbooleanfalse – отключенОпределяет вывод статистики об использовании WAL при протоколировании плана; параметр равнозначен указанию WAL команды EXPLAIN и действует только при включенном параметре auto_explain.log_analyze
auto_explain.log_timingbooleanfalse – отключенОпределяет вывод длительности на уровне узлов при протоколировании плана; параметр равнозначен указанию TIMING команды EXPLAIN и действует при включенном параметре auto_explain.log_analyze
auto_explain.log_triggersbooleanfalse – отключенОпределяет запись в протокол статистики выполнения триггеров и действует при включенном параметре auto_explain.log_analyze
auto_explain.log_verbosebooleanfalse – отключенОпределяет вывод подробных сведений при протоколировании плана; параметр равнозначен указанию VERBOSE команды EXPLAIN
auto_explain.log_settingsbooleanfalse – отключенОпределяет вывод измененных параметров конфигурации вместе с планами выполнения
auto_explain.log_formatenumtextФормат вывода для EXPLAIN;
возможные значения:
text (по умолчанию);
xml;
json;
yaml
auto_explain.log_levelenumLOGУровень, с которым auto_explain будет выводить в протокол планы запросов;
возможные значения:
DEBUG5;
DEBUG4;
DEBUG3;
DEBUG2;
DEBUG1;
INFO;
NOTICE;
WARNING;
LOG (по умолчанию)
auto_explain.log_nested_statementsbooleanfalse – отключенПротоколирование вложенных операторов, выполняемых внутри функции; если параметр отключен, протоколируются планы запросов только верхнего уровня
auto_explain.sample_ratereal1 – отслеживаются все запросыПроцент операторов, которые будут отслеживаться в каждом сеансе;
вложенные операторы отслеживаются совместно:
– все;
– никакой из них

Доработка

Доработка не проводилась.

Ограничения

Ограничения отсутствуют.

Установка

Модуль auto_explain не предоставляет функций, доступных из SQL.

Для включения необходимо загрузить его в процесс сервера. Это можно сделать в отдельном сеансе с правами суперпользователя:

LOAD 'auto_explain';

Существует следующие варианты установки параметров:

  • значения параметров задаются в конфигурационном файле СУБД postgresql.conf, суперпользователь может изменять значения в рамках текущего сеанса:

    session_preload_libraries = 'auto_explain'
    auto_explain.log_min_duration = '3s'
  • модуль загружается в некоторые или во все сеансы в результате включения auto_explain в переменную session_preload_libraries или в shared_preload_libraries в файле postgresql.conf. Загрузив модуль таким способом, можно отслеживать медленные запросы вне зависимости от того, когда они происходят.

Настройка

Настройка параметров выполняется в конфигурационном файле СУБД $PGDATA/postgresql.conf.

Пример:

auto_explain.log_min_duration = '3s'

Использование модуля

Включите модуль и настройте параметры в рамках текущей сессии:

LOAD 'auto_explain';
SET auto_explain.log_min_duration = 0;
SET auto_explain.log_analyze = true;

Выполните тестовый запрос:

SELECT count(*)
FROM pg_class, pg_index
WHERE oid = indrelid AND indisunique;

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

 count
-------
268
(1 row)

В журнал СУБД будет выведен результат работы модуля.

Пример:

2023-03-29 13:25:14 MSK [1457]: [4-1] app=psql,user=postgres,db=postgres,client=<IP-address>,type=client backend LOG:  duration: 0.550 ms planning: 2.539 ms plan:
Query Text: SELECT count(*)
FROM pg_class, pg_index
WHERE oid = indrelid AND indisunique;
Aggregate (cost=54.98..54.99 rows=1 width=8) (actual time=0.533..0.539 rows=1 loops=1)
-> Hash Join (cost=43.64..54.31 rows=268 width=0) (actual time=0.386..0.515 rows=268 loops=1)
Hash Cond: (pg_index.indrelid = pg_class.oid)
-> Seq Scan on pg_index (cost=0.00..9.97 rows=268 width=4) (actual time=0.015..0.095 rows=268 loops=1)
Filter: indisunique
Rows Removed by Filter: 29
-> Hash (cost=34.95..34.95 rows=695 width=4) (actual time=0.334..0.334 rows=695 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 33kB
-> Seq Scan on pg_class (cost=0.00..34.95 rows=695 width=4) (actual time=0.010..0.206 rows=695 loops=1)

Ссылки на документацию разработчика

Дополнительно поставляемый модуль auto_explain: https://www.postgresql.org/docs/current/auto-explain.html