2

次を使用して、約200,000個のオブジェクト(すべてに複数の関連オブジェクトがあり、合計で約2,000,000個のオブジェクト)を削除しようとしています。

DataRecord.objects.filter(order=self.order).delete()

しかし、内部サーバーエラーが発生し(約20分後)、どのオブジェクトも削除されません。この操作に十分な時間を与えるために、Apacheタイムアウトを3600(1時間)に設定しています。

非常に多くのオブジェクトをまとめて削除するより効率的な方法はありますか?

4

2 に答える 2

3

生のクエリを使用するのが最善の解決策のようですが ( https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directlyを参照) pre_deletepost_deleteシグナルは発生しません.

ランダム ORM のアイデア:DataRecord.order列はインデックス化されていますか?

編集: 列が簡単かどうかを認識するため: 列にdb_indexプロパティが設定されているかどうかを確認します。つまり:

class DataRecord(models.Model):
    order = models.IntegerField(_("order"), **db_index=True**)

インデックスを使用すると、テーブル全体を読み取ることなく、データをすばやく見つけることができます。本の中の索引のようなものです。ある単語を見つけたい場合、本全体を読まなくても索引を使用して見つけることができます。

于 2012-08-24T21:14:22.260 に答える
2

削除されるオブジェクトの数を見つけて、forループで削除を1000の倍数程度に分解します。簡単な例:

q = DataRecord.objects.filter(order=self.order)
cnt = q.count()
bucket = 1000
a, rem = divmod(cnt, bucket) 
i, j, k = 0, bucket, 0
while k<a:
    for obj in q[k*bucket: (k+1)*bucket + (k+1==a and rem)]:
        obj.delete()
    k+=1
于 2012-08-24T21:13:25.370 に答える