PostgreSQL - запрос ведет себя противоречиво - что является причиной этого? - PullRequest
1 голос
/ 11 мая 2019

У меня есть запрос в PostgreSQL (скорее вызов func), который обычно возвращается, скажем, в течение 5-6 секунд. Это случается в 90-59% случаев, я думаю. Иногда, хотя этот же самый вызов функции занимает 10-20 минут или даже 1-2 часа. Параметры, передаваемые функции в этом «более медленном случае», такие же, как и в «более быстром случае».

Что может быть причиной этого? Возможно ли, что PostgreSQL выберет другой план выполнения, хотя параметры в точности совпадают?

Так как меня спросят об общей нагрузке на сервер ... Я не думаю, что это связано. Мне кажется, я видел случаи, когда мой вызов func был медленным, даже без какой-либо значительной дополнительной нагрузки на сервер (другими сеансами клиента).

Так что, когда запрос будет медленным, мне кажется совершенно случайным. Но, логически говоря, я знаю, что это не может быть случайным, на него должен влиять какой-то фактор.

Это именно моя точка зрения: что это за фактор? Это кажется глубокой проблемой, поэтому любые хорошие предложения или советы будут высоко оценены.

Большое спасибо заранее.

Ответы [ 2 ]

2 голосов
/ 14 мая 2019

Я добавил ANALYZE "tbl" операторов для всех временных таблиц , используемых в моей функции после вставки в них данных.Я также добавил несколько индексов в некоторые из самых больших временных таблиц.

Это, похоже, решило проблему.Думаю, я никогда не узнаю, в чем именно заключалась проблема, но мне кажется, что Postgres выбирал другой план выполнения даже для тех же аргументов func.

Теперь, когда я прямо говорю: «иди и проанализируй эти временные таблицы», кажется, что Postgres всегда выбирает один и тот же / быстрый план выполнения / путь.

Просто опубликуйте этот ответ здесь, чтобы другие тоже могли его попробовать, если столкнулись с подобной проблемой.

0 голосов
/ 14 мая 2019

Да, postgres может выбрать другой план выполнения, который может быть причиной проблемы, но это кажется мне маловероятным.

Вы смотрели pg_stat_activity во время выполнения запроса в течение длительного времени? Убедитесь, что он не застрял в ожидании другого процесса, получившего блокировку.

...