Как получить план выполнения для запущенного запроса в 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.
Измените длительность на миллисекунду, что наиболее удобно для вас.