私は約2年間は正常に実行されているクエリを持っています。データベーステーブルには約5千万の行があり、ゆっくりと成長しています。この先週、私の質問のうちの1つは、ほぼ即座に復帰してから、何時間も実行するまでになりました。何年もの間単純なクエリが働いていて、突然非常に遅い
Rank.objects.filter(site=Site.objects.get(profile__client=client, profile__is_active=False)).latest('id')
私はランクモデルまでの低速クエリを絞りました。最新の()メソッドを使用することと関係があるようです。私がクエリーセットを求めたら、すぐに空のクエリーセットを返します。
#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: http://explain.depesz.com/s/ggiは、私はテーブル、変更なしの掃除をしようとしました。 「サイト」フィールド(ForeignKey)にはすでにインデックスがあります。
不思議なことに、奇妙なことに、私のアカウントに関連付けられたランクオブジェクトが既に存在する別のクライアントに対して同じクエリを実行すると、クエリは再び非常に迅速に戻ります。したがって、これは、そのクライアントのRankオブジェクトがない場合にのみ問題になると思われます。
アイデア?
バージョン: ジャンゴ1.4のsvnトランクは17047
ORDER BYのWHEREフィールドとフィールドのフィールドに複合インデックスを設定することは、そのトリックを行いました。クエリプランナは、並べ替えのインデックス全体をスキャンしてから、フィルタを実行していました。化合物指数はトリックをしました。 – erikcw