关于删除性能的级联:什么是最快的方法来删除它的1-Many行?

时间:2009-09-16 14:07:55

标签: sql-server tsql

我有一个数据库,其中有一个父“Account”行,然后与另一个表有1-Many关系,并且该表与另一个表有1-Many关系。这大约有6个级别(账户位于顶部)。在最底部可能有数千(甚至超过100k)的行。在每个表上都有一个外键设置为在删除时级联。

问题是,如果我尝试删除最上面一行(“帐户”),可能需要几分钟,有时甚至超过10分钟。是否有更快的方法来删除所有行(例如可能从单个删除语句中自下而上)或者几乎是级联的?

我正在使用MSSQL 2005& MSSQL 2008用于服务器,ans L2S执行删除,虽然我可以使用T-SQL语句,如果它更快。

我也试过从SQL Management Studio中删除,这也需要一段时间。

编辑:我们尝试重新编制数据库索引,差异可以忽略不计,可能只有一两分钟的差异。我很感激你的所有答案,看起来我将不得不开始编写一些代码来进行软删除!

3 个答案:

答案 0 :(得分:4)

删除是删除,如果要删除大量行(100k),则需要一段时间。

如果你进行软删除(例如将状态设置为“D”),那么你可以运行一个作业来实际删除批量为1000左右的行,随着时间的推移它可能会更好地为你工作。软删除应仅更新标题行,并且速度非常快。您需要对应用程序进行编码,以忽略这些“D”状态行及其子项。

修改 进一步@ Kane的评论。您只能进行软删除,或者您可以执行软删除,然后执行批处理以执行实际删除操作(如果您确实需要)。如果驱动器空间不是问题,我会坚持使用软删除。

答案 1 :(得分:2)

您是否已将所有外键编入索引?这是一个普遍的问题。

答案 2 :(得分:1)

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

在ParentId列上假设父子关系。根据定义,Parent表中的ParentId列必须具有主要或唯一约束,因此需要编制索引。但是,子表不需要在ParentId上建立索引。删除父条目时,SQL必须删除子表中已分配该外键的所有行...如果该列未编制索引,则必须使用表扫描完成工作。对于“删除链”中的每个表,这可能会发生一次。

当然,它可能只是音量。使用多个索引从100k +数据库中删除几行k,即使“删除查找”字段已编入索引,也可能需要很长时间 - 如果您在删除期间让用户访问您的系统,请不要忘记锁定和阻止! / p>

推迟删除,直到计划维护窗口,如KM建议的那样,肯定是一个选项 - 尽管可能需要对您的代码库进行严格修改。