При создании планов выполнения 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 внутреннему процессу и печатает план запроса.