F.4. auto_explain — журналирование планов выполнения медленных запросов#
F.4. auto_explain — журналирование планов выполнения медленных запросов #
Модуль auto_explain
предоставляет средство для
автоматического регистрации планов выполнения медленных операторов без
необходимости запуска EXPLAIN
вручную. Это особенно полезно для отслеживания неоптимизированных запросов
в больших приложениях.
Модуль не предоставляет функций, доступных через SQL. Чтобы использовать его, просто загрузите его в сервер. Вы можете загрузить его в отдельную сессию:
LOAD 'auto_explain';
(Вы должны быть суперпользователем, чтобы сделать это). Более типичное использование - предварительная загрузка
его в одну или несколько сессий, включая auto_explain
в
session_preload_libraries или
shared_preload_libraries в
postgresql.conf
. Затем вы сможете отслеживать неожиданно медленные запросы
в любое время. Конечно, это сопряжено с некоторыми издержками.
F.4.1. Параметры конфигурации #
В PostgreSQL есть несколько параметров конфигурации, которые управляют поведением 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
) # auto_explain.log_buffers
управляет выводом статистики использования буферов при записи плана выполнения в журнал; это эквивалент опцииBUFFERS
командыEXPLAIN
. Этот параметр не имеет эффекта, если не включен параметрauto_explain.log_analyze
. По умолчанию этот параметр отключен. Изменять этот параметр могут только суперпользователи.-
auto_explain.log_wal
(boolean
) # auto_explain.log_wal
управляет выводом статистики использования WAL при записи плана выполнения в журнал; это эквивалент параметраWAL
командыEXPLAIN
. Этот параметр не имеет эффекта, если не включен параметрauto_explain.log_analyze
. По умолчанию этот параметр отключен. Изменять этот параметр могут только суперпользователи.-
auto_explain.log_timing
(boolean
) # auto_explain.log_timing
управляет выводом информации о времени выполнения для каждого узла при записи плана выполнения в журнал; это эквивалент опцииTIMING
командыEXPLAIN
. Повторное чтение системных часов может замедлить выполнение запросов на некоторых системах, поэтому может быть полезно отключить этот параметр, когда требуются только фактические значения числа строк, а не точные времена. Этот параметр не имеет эффекта, если не включен параметрauto_explain.log_analyze
. Этот параметр включен по умолчанию. Изменять этот параметр могут только суперпользователи.-
auto_explain.log_triggers
(boolean
) # auto_explain.log_triggers
вызывает включение статистики выполнения триггеров при записи плана выполнения. Этот параметр не имеет эффекта, если не включенauto_explain.log_analyze
. По умолчанию этот параметр отключен. Изменять эту настройку могут только суперпользователи.-
auto_explain.log_verbose
(boolean
) # auto_explain.log_verbose
управляет выводом подробной информации при записи плана выполнения в журнал; он эквивалентен опцииVERBOSE
командыEXPLAIN
. По умолчанию этот параметр отключен. Изменять эту настройку могут только суперпользователи.-
auto_explain.log_settings
(boolean
) # auto_explain.log_settings
управляет выводом информации о измененных настройках конфигурации при записи плана выполнения в журнал. В вывод включаются только опции, влияющие на планирование запросов и имеющие значение, отличное от встроенного значения по умолчанию. По умолчанию этот параметр отключен. Изменять эту настройку могут только суперпользователи.-
auto_explain.log_format
(enum
) # auto_explain.log_format
выбирает формат выводаEXPLAIN
, который будет использоваться. Допустимые значения:text
,xml
,json
иyaml
. По умолчанию используется формат text. Изменять эту настройку могут только суперпользователи.-
auto_explain.log_level
(enum
) # auto_explain.log_level
выбирает уровень журналирования, на котором auto_explain будет записывать план запроса. Допустимые значения:DEBUG5
,DEBUG4
,DEBUG3
,DEBUG2
,DEBUG1
,INFO
,NOTICE
,WARNING
, иLOG
. По умолчанию используется значениеLOG
. Изменить эту настройку может только суперпользователь.-
auto_explain.log_nested_statements
(boolean
) # auto_explain.log_nested_statements
вызывает регистрацию в журнале вложенных операторов (операторов, выполняемых внутри функции). Когда он отключен, регистрируются только планы верхнего уровня запросов. Этот параметр по умолчанию отключен. Изменять эту настройку могут только суперпользователи.-
auto_explain.sample_rate
(real
) # auto_explain.sample_rate
приводит к тому, что auto_explain объясняет только долю операторов в каждой сессии. По умолчанию значение равно 1, что означает объяснение всех запросов. В случае вложенных операторов, будут объяснены либо все, либо ни один. Изменять это значение могут только суперпользователи.
В обычном использовании эти параметры устанавливаются в файле postgresql.conf
, хотя суперпользователи могут изменять их "на лету" в рамках своих собственных сессий. Типичное использование может быть:
# postgresql.conf session_preload_libraries = 'auto_explain' auto_explain.log_min_duration = '3s'
F.4.2. Пример #
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
F.4.3. Автор #
Takahiro Itagaki <itagaki.takahiro@oss.ntt.co.jp>