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

У меня есть неоптимизированный запрос, который выполняется в течение различного времени выполнения в разное время дня в диапазоне от 1 минуты до 14 часов. Загрузка ЦП, память и другая параллельная нагрузка на базу данных остаются прежними, что может привести к таким изменениям? Обратите внимание, что автоматический вакуумный процесс выполняется в полночь, а производительность значительно улучшается утром. Я утверждаю, что из-за фрагментации таблиц, мертвых кортежей и большого количества чтений статистика по одной и той же таблице изменяется, что приводит к другому плану выполнения. Чтобы доказать это утверждение, я хотел бы получить план запроса для текущего выполняемого запроса. Обратите внимание, что я не могу просто EXPLAIN запрос перед выполнением.

1 ответ

Подождите, я получил это работает. В postgresql.conf есть ДВА настройки для предварительной загрузки библиотек. Первый, shared_preload_libraries, не будет работать без перезапуска. НО другая сессия_preload_libraries БУДЕТ. Итак, отредактируйте файл postgresql.conf, добавив в него следующую строку:

session_preload_libraries = 'auto_explain'

Затем перезагрузите:

pg_ctl reload (or pg_ctlcluster 9.x main reload etc)

Затем измените базу данных, чтобы включить ее:

alter database smarlowe set auto_explain.log_min_duration=1;

И тогда все новые соединения получают планы auto_explain.

Измените длительность на миллисекунду, что наиболее удобно для вас.

Другие вопросы по тегам