我有一个查询已经运行了大约两年,一直很正常。这个数据库表大约有5000万行数据,并且增长缓慢。但是最近一周,我的一个查询从几乎瞬间返回结果变成了需要数小时才能运行完毕。
Rank.objects.filter(site=Site.objects.get(profile__client=client, profile__is_active=False)).latest('id')
我将缓慢查询的范围缩小到Rank模型。似乎与使用latest()方法有关。如果只请求一个queryset,它会立即返回一个空的queryset。
#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 我尝试过对表进行了vacuum操作,但没有改变。字段“site”(外键)已经建立了索引。
奇怪的是,如果我为已经与Rank对象关联的另一个客户端运行相同的查询,那么查询再次非常快地返回。因此,似乎只有当该客户端没有Rank对象时才会出现问题。
有什么想法吗?
版本: Postgres 9.1, Django 1.4 svn trunk rev 17047