2011-04-12 51 views
0

我的SQL Server 2008 R2数据库有很多的大,相关表:批量删除 - 级联删除性能杀手?

  • 详细-1
  • 详细-2
  • 详细-2-A

所有外键级联:

  • master - > detail1
  • 主 - > detail2
  • detail2-> detail2-A

所以,当我从主删除记录,所有相关的细节如下。 删除需要很长时间。例如。一位主人可以在detail2中拥有120万条记录,在detail2A中拥有6000万条记录。

创建一个首先删除detail2A,然后是detail2等的存储过程会更有效吗?还是有更好的方法。

数据库未分区。

回答

1

我们不允许在我们的系统上删除级联,因为在完成大量删除时您无法控制锁定表。如果您有大量记录需要经常删除,有几种选择。首先,你真的需要删除还是应该让它们变为非活动状态?这可能是最有效的处理方式。

或者你可以分批处理。将所有要删除的id值移到登台表中,然后将其删除1000(或20000或200,实际的号码只能由系统根据性能决定),并一次循环直到所有记录被删除。您仍然可能想要一次删除一张表中的记录,而不是在级联中删除。

或者您可以标记要删除的记录,并在数据库使用率较低的时段进行实际的删除操作,以避免阻止其他用户。

级联删除需要考虑的一件事是,如果存在子记录,您是否真的想删除该记录?外键的存在,部分原因是阻止你这样做,级联删除覆盖该行为。因此,如果您的孩子记录与订单类似,在任何情况下您都不希望在级联删除中自动删除它们,否则即使客户不再处于活动状态,您也将失去所需的财务信息。