У меня был запрос, который работал нормально около 2 лет.Таблица базы данных имеет около 50 миллионов строк и медленно растет.На прошлой неделе один из моих запросов перешел от почти мгновенного возврата к выполнению нескольких часов.
Rank.objects.filter(site=Site.objects.get(profile__client=client, profile__is_active=False)).latest('id')
Я сузил медленный запрос до модели ранга.Кажется, что-то связано с использованием метода 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
И ОБЪЯСНИТЕ АНАЛИЗ: http://explain.depesz.com/s/ggi
Я пытался пылесосить стол, без изменений.В поле "site" уже есть индекс (ForeignKey).
Странно, если я выполню этот же запрос для другого клиента, у которого уже есть объекты Rank, связанные с его учетной записью, запрос снова очень быстро возвращается.,Так что кажется, что это проблема, только если у него нет объектов Rank для этого клиента.
Есть идеи?
Версии: Postgres 9.1, Django 1.4 svn trunk rev 17047