批量删除 - 级联删除性能杀手?

时间:2011-04-12 09:54:06

标签: sql-server-2008

我的SQL Server 2008R2数据库有很多大的相关表:

  • 细节-1
  • 细节-2
  • 细节-2-甲

所有外键都是级联的:

  • master - > detail1
  • master - > detail2
  • detail2->详细-2-甲

因此,当我从master中删除记录时,所有相关详细信息都会跟随。 删除需要很长时间。例如。一个主人可以详细记录120万条记录2和详细记录的6千万条记录。

创建一个首先删除detail2A,然后删除detail2等的存储过程是否更有效。或者是否有更好的方法。

DB没有被分配。

1 个答案:

答案 0 :(得分:1)

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

或者您可以批量处理。将您想要删除的所有id值移动到临时表,然后将它们删除1000(或20000或200实际数字只能由系统确定性能原因。)并一直循环直到所有记录都被删除。您仍然可能希望一次删除一个表中的记录,而不是以级联方式删除。

或者您可以将记录标记为删除,并在数据库的低使用期间过夜进行实际删除,以避免阻止其他用户。

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