У нас есть запрос, который мы использовали в течение нескольких месяцев.Это недавно начало висеть.Запрос представляет собой объединение из 4 таблиц.Одна из этих таблиц - всего несколько тысяч записей, одна сотня тысяч, а две - около 2 миллионов.Он работал около 20 секунд в течение нескольких месяцев.После нескольких попыток определить проблему путем добавления индексов к неиндексированным полям, но безрезультатно, мы изменили одну из больших таблиц как подзапрос с результатом 100000 записей против 2 миллионов.Теперь запрос выполняется за 20 секунд.
Объяснение зависшего запроса дает:
Limit (cost=1714850.81..1714850.81 rows=1 width=79)
В то время как объяснение запроса, выполняемого за 20 секунд, выдает:
Limit (cost=1389451.40..1389451.40 rows=1 width=79)
Запрос, который зависает, больше, но не указывает на существенную разницу.
Вопросы:
- Существуют ли ограничения в postgres, которые заставляют его по-разному использовать системные ресурсы, то есть буферизацию диска по сравнению с буферизацией памяти?Запрос, который зависает, показывает один процессор со 100% использованием.Система Linux.Iotop не показывает необычное использование io.Система имеет 32 ГБ оперативной памяти и 8 процессоров.Postgres не загружается системой слишком сильно.
- Существуют ли другие инструменты, которые можно применить?В этом случае подвыбор запроса работал, но в будущем мы не сможем уменьшить размеры соединения таким образом.
Как примечание, полное объяснение не показывает заметно другой план выполнения.Спасибо, Дэн