auto_explain — логирование планов выполнения медленных запросов
Эта страница переведена при помощи нейросети GigaChat.
Модуль auto_explain
предоставляет возможность автоматического ведения журнала планов выполнения медленных операторов без необходимости вручную запускать EXPLAIN. Это особенно полезно для поиска неоптимизированных запросов в больших приложениях.
Этот модуль не предоставляет функций, доступных через SQL. Чтобы использовать его, просто загрузите его на сервер. Можно загрузить его в отдельный сеанс:
LOAD 'auto_explain';
Необходимо быть суперпользователем, чтобы сделать это. Более типичное использование – предварительно загрузить его в одно или несколько сеансов, включив auto_explain
в session_preload_libraries
или shared_preload_libraries
в postgresql.conf
. Тогда можно будет отслеживать неожиданно медленные запросы независимо от того, когда они происходят. Конечно, за это придется платить накладными расходами.
Параметры конфигурации
Существует несколько параметров конфигурации, которые управляют поведением auto_explain
. Обратите внимание, что поведение по умолчанию заключается в том, чтобы ничего не делать, поэтому необходимо установить хотя бы auto_explain.log_min_duration
, чтобы получить какие-либо результаты.
auto_explain.log_min_duration (integer)
auto_explain.log_min_duration
– минимальное время выполнения оператора, в миллисекундах, которое приведет к регистрации плана этого оператора. Установка этого значения в 0
регистрирует все планы. -1
(по умолчанию) отключает регистрацию планов. Например, если установить его равным 250ms
, то будут регистрироваться все операторы, выполняющиеся 250 мс и более. Только суперпользователи могут изменить этот параметр.
auto_explain.log_parameter_max_length (integer)
auto_explain.log_parameter_max_length
управляет регистрацией значений параметров запроса. Значение -1
(по умолчанию) регистрирует значения параметров полностью. 0
отключает регистрацию значений параметров. Положительное значение ограничивает длину каждого параметра указанным числом байт. Только суперпользователи могут изменить этот параметр.
auto_explain.log_analyze (boolean)
auto_explain.log_analyze
включает запись в протокол вывод команды EXPLAIN ANALYZE
, а не просто EXPLAIN
, когда регистрируется план выполнения. Этот параметр по умолчанию выключен. Только суперпользователи могут изменить этот параметр.
Когда этот параметр включен, для всех выполняемых операторов выполняется покомпонентное измерение времени, независимо от того, работают ли они достаточно долго, чтобы фактически быть зарегистрированными. Это может оказать крайне негативное влияние на производительность. Отключение auto_explain.log_timing
смягчает затраты на производительность за счет получения меньшей информации.
auto_explain.log_buffers (boolean)
Управляет тем, печатаются ли статистики использования буфера при регистрации плана выполнения, эквивалентен параметру BUFFERS
команды EXPLAIN
. Параметр не имеет эффекта, если auto_explain.log_analyze
отключен. Выключен по умолчанию. Только суперпользователи могут изменить эту настройку.
auto_explain.log_wal (boolean)
Управляет тем, печатаются ли статистики использования WAL при регистрации плана выполнения, эквивалентен параметру WAL
команды EXPLAIN
. Этот параметр не имеет эффекта, если auto_explain.log_analyze
отключен. Параметр выключен по умолчанию. Только суперпользователи могут изменить эту настройку.
auto_explain.log_timing (boolean)
Управляет тем, выводится ли информация о времени работы каждого узла при регистрации плана выполнения, эквивалентен параметру TIMING
команды EXPLAIN
. Повторяющееся чтение системных часов может значительно замедлить выполнение запросов на некоторых системах, поэтому может быть полезно выключить этот параметр, когда нужны только фактические подсчеты строк, а не точные временные метки. Этот параметр не имеет эффекта, если auto_explain.log_analyze
отключен. Параметр включен по умолчанию. Только суперпользователи могут изменить эту настройку.
auto_explain.log_triggers (boolean)
Приводит к включению статистических данных о выполнении триггеров при регистрации плана выполнения. Этот параметр не имеет эффекта, если auto_explain.log_analyze
отключен. Параметр выключен по умолчанию. Только суперпользователи могут изменить эту настройку.
auto_explain.log_verbose (boolean)
Управляет тем, печатаются ли подробные сведения при регистрации плана выполнения, эквивалентен параметру VERBOSE
для EXPLAIN
. Параметр отключен по умолчанию. Только суперпользователи могут изменить эту настройку.
auto_explain.log_settings (boolean)
Контролирует, печатается ли информация об измененных параметрах конфигурации при регистрации плана выполнения. В вывод включаются только параметры, влияющие на планирование запросов со значением, отличным от встроенного значения по умолчанию. Параметр отключен по умолчанию. Только суперпользователи могут изменить эту настройку.
auto_explain.log_format (enum)
Выбирает формат вывода EXPLAIN
, который будет использоваться. Допустимые значения: text
, xml
, json
и yaml
. По умолчанию используется текст. Только суперпользователи могут изменить эту настройку.
auto_explain.log_level (enum)
Выбирает уровень журнала, на котором auto_explain
будет регистрировать план запроса. Допустимыми значениями являются: DEBUG5
, DEBUG4
, DEBUG3
, DEBUG2
, DEBUG1
, INFO
, NOTICE
, WARNING
и LOG
. Значение по умолчанию – LOG
. Только суперпользователи могут изменить эту настройку.
auto_explain.log_nested_statements (boolean)
При включении вложенные операторы (операторы, выполняемые внутри функции) учитываются для ведения журнала. Когда он выключен, регистрируются только планы запросов верхнего уровня. Параметр отключен по умолчанию. Только суперпользователи могут изменить эту настройку.
auto_explain.sample_rate (real)
Задает для auto_explain
процент операторов, которые будут отслеживаться в каждом сеансе. По умолчанию значение равно 1
, что означает объяснение всех запросов. В случае вложенных операторов либо все они будут объяснены, либо ни один из них не будет объяснен. Только суперпользователи могут изменить эту настройку.
При обычном использовании параметры устанавливаются в postgresql.conf
, хотя суперпользователи могут изменять их на лету в своих собственных сессиях. Типичное использование может быть следующим:
# postgresql.conf
session_preload_libraries = 'auto_explain'
auto_explain.log_min_duration = '3s'
Пример
postgres=# LOAD 'auto_explain';
postgres=# SET auto_explain.log_min_duration = 0;
postgres=# SET auto_explain.log_analyze = true;
postgres=# SELECT count(*)
FROM pg_class, pg_index
WHERE oid = indrelid AND indisunique;
Результат работы команд может привести к выводу журнала, такому как:
LOG: duration: 3.651 ms plan:
Query Text: SELECT count(*)
FROM pg_class, pg_index
WHERE oid = indrelid AND indisunique;
Aggregate (cost=16.79..16.80 rows=1 width=0) (actual time=3.626..3.627 rows=1 loops=1)
-> Hash Join (cost=4.17..16.55 rows=92 width=0) (actual time=3.349..3.594 rows=92 loops=1)
Hash Cond: (pg_class.oid = pg_index.indrelid)
-> Seq Scan on pg_class (cost=0.00..9.55 rows=255 width=4) (actual time=0.016..0.140 rows=255 loops=1)
-> Hash (cost=3.02..3.02 rows=92 width=4) (actual time=3.238..3.238 rows=92 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 4kB
-> Seq Scan on pg_index (cost=0.00..3.02 rows=92 width=4) (actual time=0.008..3.187 rows=92 loops=1)
Filter: indisunique