У меня огромный SQL-запрос. Вероятно, это было 15-20 таблиц. Есть 6-7 подзапросов, которые снова соединяются. Этот запрос в большинстве случаев занимает минуту, чтобы запустить и вернуть 5 миллионов записей.Postgres Query Plan продолжает меняться - делает запрос в минуту, чтобы иногда заканчивать и никогда не заканчивается иногда
Так что даже если этот запрос плохо написан, у него есть план запросов, который заставляет его закончить через минуту. Я гарантировал, что запрос действительно выполнялся и не использовал кешированные результаты.
Иногда план запроса поднимается, а затем он не заканчивается. Каждый вечер я запускаю вакуумный анализ на таблицах, участвующих в запросе. В настоящее время work_memory установлен на 200 МБ. Я попытался увеличить это до 2 ГБ. Я не испытал, что запрос запутался, когда work_memory составлял 2 ГБ. Но когда я уменьшил его и запустил запрос, он запутался. Теперь, когда я увеличил его до 2 ГБ, запрос все еще запутан. Это что-то связано с тем, что план запроса не обновляется с новой настройкой? Я попытался отказаться от плана на моей сессии.
Я могу только думать о work_mem и анализе вакуума на этом этапе. Любые другие факторы, которые могут повлиять на плавно выполняемый запрос, который возвращает результаты за минуту, чтобы пойти и ничего не вернуть?
Дайте мне знать, если вам нужна дополнительная информация о любых настройках? или сам запрос? Я также могу вставить план тоже ... Но запрос и план или слишком большой, чтобы вставлять здесь.
15-20 столов в таблице диапазонов: генетический оптимизатор будет входить. Либо увеличьте geqo_limit, либо поместите часть своей таблицы в CTE. Если у вас уже есть некоторые подзапросы, продвиньте еще один из них в CTE. – wildplasser
oops, имя 'geqo_threshold'. его значение по умолчанию равно 12. Установка слишком высокой (20, вероятно, слишком высокая ...) заставит планировщика потребоваться ** много времени ** для оценки всех планов. (количество планов в основном экспоненциально зависит от количества RTE) – wildplasser