私はモデルのすべてのオブジェクトのクエリーセットを持っています。オブジェクトを反復すると、列内の値の繰り返しで更新行が削除されます。だからデータベースをもう一度打つことなく、私は大きなクエリセットから更新された行を削除したい。djangoのより大きいクエリーセットからクエリーセットを除外しないでデータベースを打ちます
これを行う最も効率的な方法は何ですか?
私はモデルのすべてのオブジェクトのクエリーセットを持っています。オブジェクトを反復すると、列内の値の繰り返しで更新行が削除されます。だからデータベースをもう一度打つことなく、私は大きなクエリセットから更新された行を削除したい。djangoのより大きいクエリーセットからクエリーセットを除外しないでデータベースを打ちます
これを行う最も効率的な方法は何ですか?
具体的なユースケースについての詳細情報を提供する必要があるかもしれませんが、実際に必要となるまで、DjangoはQuerySetsの評価を延期します。大規模なQuerySetとは別に除外セットのQuerySetを作成できる場合は、.exclude()
メソッドを呼び出し、2つの小さいクエリの代わりに1つの大きなクエリを生成することができます。例:
excluded_set = Model.objects.filter(...)
large_set = Model.objects.filter().exclude(id__in=excluded_set)
SQLに元のリストをフィルタリングする方がよい場合があります。 WHERE句を効率的に実行するように最適化されています。 – duffymo
それは本当ですが、実際に私はSQLで同様のことを試みましたが、それはあまりにも多くの時間とCPU使用量を取っていた。私はSQlでうまくいきません:( – sprksh
あなたのスキーマには索引がないことを示唆しています。SQLでEXPLAIN PLANを実行し、テーブルスキャンを探します。 – duffymo