PostgreSQL: можно ли распечатать план запроса текущего запроса? - PullRequest
0 голосов
/ 09 марта 2020

Я регулярно выполнял один и тот же запрос отчета и большую часть времени выполнялся в течение нескольких минут. Однако иногда он застревает часами недетерминированно c. Когда он застрял, я повторил тот же запрос с EXPLAIN ANALYZE, но последний быстро закончился.

Почему это так? Как получить план выполнения запущенного запроса?

1 Ответ

1 голос
/ 09 марта 2020

При создании планов выполнения PostgreSQL планировщик запросов в значительной степени опирается на статистику таблиц . Статистика обновляется командой ANALYZE и процессом автоочистки . В вашем случае кажется, что в большинстве случаев статистика верна, но время от времени она устаревает, что приводит к неэффективному плану запросов. Это может произойти после массовой вставки или обновления строки.

Чтобы увидеть план запроса после его завершения, используйте модуль auto_explain . Например, следующие команды настраивают сеанс для регистрации планов всех запросов, которые длились более часа:

LOAD 'auto_explain';
SET auto_explain.log_min_duration = '1h';
SET auto_explain.log_analyze = true;

Параметры также можно задать в postgresql .conf. Модуль должен быть загружен до начала запроса.

Если вы хотите получить план уже запущенного запроса и не хотите ждать его завершения, вы можете использовать внешний скрипт, доступный по адресу https://github.com/StarfishStorage/explain-running-query. Сценарий основан на модуле auto_explain . Он присоединяет GDB к PostgreSQL внутреннему процессу и печатает план запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...