SQL删除耗时太长

时间:2011-07-28 14:55:43

标签: asp.net sql linq-to-sql

我们有一个表(比如T1),在我们的SQL Server数据库中有大约16个其他带有外键的表引用。使用LINQToSQL通过ASP.NET应用程序访问数据。当用户尝试从T1删除记录时,语句将超时。所以我们决定先从引用T1的表中删除记录,然后再删除T1中的记录。问题是从T1中删除的速度不如预期的那么快。

我的问题是:即使记录本身没有任何“子”记录,从许多其他表引用的表中删除也是如此耗时是正常的吗?

编辑:显然,超时的原因不是删除本身,而是另一个从同一DataContext检索数据的查询。感谢您的建议,我已经标记了为所有外键添加索引的建议,因为它改进了我们脚本的执行计划。

3 个答案:

答案 0 :(得分:2)

在DB中定义关系时,可以在SQL Server中将Delete rule设置为Cascade。这样,当您从父表中删除记录时,它将自动从子表中删除。

请参阅下图:

enter image description here

  

如果花费很长时间,您可能设置了其他会减慢的约束   删除过程。

答案 1 :(得分:2)

我怀疑您可能需要查看子表上的索引。

听起来好像你的FK设置为​​Cascade Deletes,所以我怀疑你的某些表没有包含父作为索引中第一个键的索引。

通过这种方式,您的删除将完全扫描子表 - 即使您已经删除了子记录,它仍然会检查,因为您仍然有Cascade设置。

答案 2 :(得分:1)

如果您直接在记录集上操作,Linq不进行批量删除 - 相反,它可能一次删除一条记录

要提高性能,请使用存储过程代替批量插入,更新或删除操作。