производительность postgres - зависание запросов - инструменты анализа запросов и вопросы конфигурации - PullRequest
0 голосов
/ 29 января 2019

У нас есть запрос, который мы использовали в течение нескольких месяцев.Это недавно начало висеть.Запрос представляет собой объединение из 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 не загружается системой слишком сильно.
  • Существуют ли другие инструменты, которые можно применить?В этом случае подвыбор запроса работал, но в будущем мы не сможем уменьшить размеры соединения таким образом.

Как примечание, полное объяснение не показывает заметно другой план выполнения.Спасибо, Дэн

...