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

У меня был запрос, который работал нормально около 2 лет. В таблице базы данных около 50 миллионов строк, и она медленно растет. На прошлой неделе один из моих запросов перешел с почти мгновенного ответа на выполнение нескольких часов.

Rank.objects.filter(site=Site.objects.get(profile__client=client, profile__is_active=False)).latest('id')

Я сузил медленный запрос до модели Rank. Похоже, это как-то связано с использованием метода latest (). Если я просто прошу набор запросов, он сразу же вернет пустой набор запросов.

#count returns 0 and is fast
Rank.objects.filter(site=Site.objects.get(profile__client=client, profile__is_active=False)).count() == 0
Rank.objects.filter(site=Site.objects.get(profile__client=client, profile__is_active=False)) == [] #also very fast

Вот результаты выполнения EXPLAIN. http://explain.depesz.com/s/wPh

И EXPLAIN ANALYZE: http://explain.depesz.com/s/ggi

Я попытался очистить стол пылесосом, без изменений . В поле «сайт» (ForeignKey) уже есть указатель.

Как ни странно, если я запускаю тот же запрос для другого клиента, у которого уже есть объекты Rank, связанные с его учетной записью, то запрос снова очень быстро возвращается. Таким образом, похоже, что это проблема только тогда, когда для этого клиента нет объектов Rank.

Есть идеи?

Версии: Postgres 9.1, Django 1.4 svn trunk rev 17047

7
задан erikcw 26 November 2011 в 08:09
поделиться