我有一個查詢已運行良好約2年。數據庫表大約有5000萬行,並且增長緩慢。上週我的一個疑問從幾乎立即返回到花費數小時才能完成。簡單的查詢工作多年,然後突然很慢
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
,並解釋分析一下:http://explain.depesz.com/s/ggi
我試着抽真空表,沒有任何變化。 「site」字段(ForeignKey)已經有一個索引。
奇怪的是,如果我爲另一個已經有與她的帳戶關聯的Rank對象的客戶端運行相同的查詢,那麼查詢將很快再次返回。所以,這似乎只是一個問題,當他們沒有該客戶端的對象。
任何想法?
版本: 的Postgres 9.1, Django的1.4 SVN主幹修訂版17047個
在WHERE字段中設置複合索引以及ORDER BY中的字段做了一個技巧。原來,查詢計劃員正在掃描整個索引,然後進行篩選。複合指數做到了訣竅。 – erikcw