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 循环中将删除分解为一千左右的倍数。一个简单的例子:

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 回答