我有一个数据库,其中有一个父“账户”一行随后与另一台有1一对多的关系,并且该表与另一表1一对多的关系。 这正好约6层深(与客户在顶部)。 在最底层有也可能会被成千上万(甚至可以超越100K)的行。 在每个表都有一个外键设置为级联上的删除。
问题是,如果我尝试删除最顶端行(一个“账户”),它可能需要几分钟,有时超过10分钟。 有没有删除所有行(如从底部可能往上走在DELETE语句),或者级联相当多了一个更快的方法?
我使用MSSQL 2005年及2008年MSSQL的服务器,ANS L2S执行删除,虽然我可以使用T-SQL语句,如果它是速度更快。
香港专业教育学院试图从SQL Management Studio中做删除过,而这需要一样长。
编辑 :我们试图重新建立索引数据库,有微小差别,也许一两间分钟的差异。 我很欣赏你的答案,它看起来像我将不得不开始编写一些代码做软删除!
一个删除是删除,如果你想删除的行(100K)的大量的,这将需要一段时间。
如果你做一个软删除(设置状态为“d”为例),你就可以运行作业在说1000左右,随着时间的推移,可能更好地为您的批次实际上是删除行。 软删除应该只更新标题行,并会非常快。 你需要编写你的应用程序,虽然忽略这些“d”状态行和他们的孩子。
编辑要进一步凯恩的评论。 你只能做一个软删除,或者你可以做一个软删除后的批处理过程中做实际删除,如果你真的想。 我刚与柔删除坚持,如果驱动器空间不是问题。
这听起来像你可能有索引问题。
假设在列的ParentId父母对孩子的关系。 根据定义,在父表中的列的ParentId必须有一个主或唯一约束,从而被编入索引。 子表,但是,不必对的ParentId索引。 当您删除父项,SQL有权删除已分配外键子表中的所有行...如果该列没有被索引,工作就必须与表扫描完成。 这可能会在你的“缺失链”为每个表出现一次。
当然,这可能只是音量。 从100K +数据库删除几k行与多个索引,即使“删除查找”字段建立索引,可能需要显著的时间 - 并且不要忘锁定和拦截,如果你有用户在删除访问你的系统!
推迟删除直至安排维护窗口,KM建议,肯定是一种选择 - 尽管它可能需要认真修改你的代码库。
文章来源: Cascade on delete performance: Whats the fastest way to delete a row its 1-Many rows?