我们有一个表(比如T1),在我们的SQL Server数据库中有大约16个其他带有外键的表引用。使用LINQToSQL通过ASP.NET应用程序访问数据。当用户尝试从T1删除记录时,语句将超时。所以我们决定先从引用T1的表中删除记录,然后再删除T1中的记录。问题是从T1中删除的速度不如预期的那么快。
我的问题是:即使记录本身没有任何“子”记录,从许多其他表引用的表中删除也是如此耗时是正常的吗?
编辑:显然,超时的原因不是删除本身,而是另一个从同一DataContext检索数据的查询。感谢您的建议,我已经标记了为所有外键添加索引的建议,因为它改进了我们脚本的执行计划。
答案 0 :(得分:2)
在DB中定义关系时,可以在SQL Server中将Delete rule
设置为Cascade
。这样,当您从父表中删除记录时,它将自动从子表中删除。
请参阅下图:
如果花费很长时间,您可能设置了其他会减慢的约束 删除过程。
答案 1 :(得分:2)
我怀疑您可能需要查看子表上的索引。
听起来好像你的FK设置为Cascade Deletes,所以我怀疑你的某些表没有包含父作为索引中第一个键的索引。
通过这种方式,您的删除将完全扫描子表 - 即使您已经删除了子记录,它仍然会检查,因为您仍然有Cascade设置。
答案 2 :(得分:1)
如果您直接在记录集上操作,Linq不进行批量删除 - 相反,它可能一次删除一条记录。
要提高性能,请使用存储过程代替批量插入,更新或删除操作。