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

Sql server 2008 批量删除-级联删除性能杀手?,sql-server-2008,Sql Server 2008,我的SQL Server 2008R2数据库有许多大型相关表: 主人 详图-1 细节-2 详图2-A 所有外键都是级联的: 主控->详细信息1 主控->详细信息2 详图2->详图2-A 因此,当我从master中删除一条记录时,所有相关的细节都会随之发生。 删除需要很长时间。例如,一台主机可以有120万条详细记录2和6000万条详细记录2 创建一个先删除detail2A,然后删除detail2等的存储过程会更有效吗?还是有更好的方法 数据库没有分区。我们不允许在系统上进行删除级联,因为在

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

  • 主人
  • 详图-1
  • 细节-2
  • 详图2-A
所有外键都是级联的:

  • 主控->详细信息1
  • 主控->详细信息2
  • 详图2->详图2-A
因此,当我从master中删除一条记录时,所有相关的细节都会随之发生。 删除需要很长时间。例如,一台主机可以有120万条详细记录2和6000万条详细记录2

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


数据库没有分区。

我们不允许在系统上进行删除级联,因为在执行大型删除时,您无法控制锁定表。如果要频繁删除大量记录,有几种选择。首先,您真的需要删除它们吗?还是应该将它们设置为非活动状态?这可能是最有效的处理方法

也可以分批处理。将要删除的所有id值移动到暂存表中,然后一次删除1000个(或20000或200个,实际数量只能由系统出于性能原因确定),并循环执行,直到删除所有记录。您可能仍然希望体验一次删除一个表中的记录,而不是级联删除

或者,您可以将记录标记为删除,并在数据库的低使用期内隔夜执行实际删除,以避免阻塞其他用户

一个考虑级联删除的问题:如果子记录存在,您真的想要删除该记录吗?外键的存在部分是为了阻止您这样做,并级联删除覆盖该行为。因此,如果您的子记录类似于订单,您在任何情况下都不希望在级联删除中自动删除它们,否则即使客户不再活跃,您也会丢失所需的财务信息