在级联删除性能:什么最快的方法删除行的一对多行?(Cascade on delete perform

2019-07-18 05:53发布

我有一个数据库,其中有一个父“账户”一行随后与另一台有1一对多的关系,并且该表与另一表1一对多的关系。 这正好约6层深(与客户在顶部)。 在最底层有也可能会被成千上万(甚至可以超越100K)的行。 在每个表都有一个外键设置为级联上的删除。

问题是,如果我尝试删除最顶端行(一个“账户”),它可能需要几分钟,有时超过10分钟。 有没有删除所有行(如从底部可能往上走在DELETE语句),或者级联相当多了一个更快的方法?

我使用MSSQL 2005年及2008年MSSQL的服务器,ANS L2S执行删除,虽然我可以使用T-SQL语句,如果它是速度更快。

香港专业教育学院试图从SQL Management Studio中做删除过,而这需要一样长。

编辑 :我们试图重新建立索引数据库,有微小差别,也许一两间分钟的差异。 我很欣赏你的答案,它看起来像我将不得不开始编写一些代码做软删除!

Answer 1:

一个删除是删除,如果你想删除的行(100K)的大量的,这将需要一段时间。

如果你做一个软删除(设置状态为“d”为例),你就可以运行作业在说1000左右,随着时间的推移,可能更好地为您的批次实际上是删除行。 软删除应该只更新标题行,并会非常快。 你需要编写你的应用程序,虽然忽略这些“d”状态行和他们的孩子。

编辑要进一步凯恩的评论。 你只能做一个软删除,或者你可以做一个软删除后的批处理过程中做实际删除,如果你真的想。 我刚与柔删除坚持,如果驱动器空间不是问题。



Answer 2:

这听起来像你可能有索引问题。

假设在列的ParentId父母对孩子的关系。 根据定义,在父表中的列的ParentId必须有一个主或唯一约束,从而被编入索引。 子表,但是,不必对的ParentId索引。 当您删除父项,SQL有权删除已分配外键子表中的所有行...如果该列没有被索引,工作就必须与表扫描完成。 这可能会在你的“缺失链”为每个表出现一次。

当然,这可能只是音量。 从100K +数据库删除几k行与多个索引,即使“删除查找”字段建立索引,可能需要显著的时间 - 并且不要忘锁定和拦截,如果你有用户在删除访问你的系统!

推迟删除直至安排维护窗口,KM建议,肯定是一种选择 - 尽管它可能需要认真修改你的代码库。



Answer 3:

你有没有索引的所有外键? 这是一个常见的问题。



文章来源: Cascade on delete performance: Whats the fastest way to delete a row its 1-Many rows?