У меня был запрос, который работал нормально около 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