auto_explain. Автопротоколирование планов выполнения медленных операторов
В исходном дистрибутиве установлено по умолчанию: нет.
Связанные компоненты: отсутствуют.
Схема размещения: не используется.
Модуль auto_explain
предоставляет возможность автоматического протоколирования планов выполнения медленных операторов, что позволяет обойтись без выполнения EXPLAIN
вручную. Возможно применение для выявления неоптимизированных запросов в больших приложениях.
Протокол выводится в текущий журнал работы СУБД. Журналы расположены в каталоге, который указан в параметре СУБД log_directory
.
Ниже приведены параметры конфигурации, которые управляют поведением auto_explain
. Поведение по умолчанию сводится к бездействию, поэтому необходимо установить как минимум переменную auto_explain.log_min_duration
задается, если необходимо получить какие-либо результаты.
Все указанные параметры могут быть изменены только пользователем с правами суперпользователя.
Параметр | Тип значения | Значение по умолчанию | Описание |
|
|
| Время выполнения оператора в миллисекундах. При превышении указанного времени план оператора будет протоколироваться. Возможные значения:
|
|
|
| При включении параметра в протокол будет записываться вывод команды Отключение |
|
|
| Определяет вывод статистики об использовании буферов при протоколировании плана; параметр равнозначен указанию |
|
|
| Определяет вывод статистики об использовании WAL при протоколировании плана; параметр равнозначен указанию |
|
|
| Определяет вывод длительности на уровне узлов при протоколировании плана; параметр равнозначен указанию |
|
|
| Определяет запись в протокол статистики выполнения триггеров и действует при включенном параметре |
|
|
| Определяет вывод подробных сведений при протоколировании плана; параметр равнозначен указанию |
|
|
| Определяет вывод измененных параметров конфигурации вместе с планами выполнения |
|
|
| Формат вывода для Возможные значения:
|
|
|
| Уровень, с которым Возможные значения:
|
|
|
| Протоколирование вложенных операторов, выполняемых внутри функции. Если параметр отключен, протоколируются планы запросов только верхнего уровня |
|
|
| Процент операторов, которые будут отслеживаться в каждом сеансе; Вложенные операторы отслеживаются совместно:
|
Доработка
Доработка не проводилась.
Ограничения
Ограничения отсутствуют.
Установка
Установка расширения может быть произведена в процессе развертывании СУБД Pangolin при использовании настроек по умолчанию (документ «Руководство по установке», раздел «Автоматизированная установка при помощи Ansible-скриптов»).
Модуль 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.