我们有一个表(比如说T1),在我们的SQL Server数据库中有大约16个其他表使用外键引用。数据通过一个带有LINQToSQL的ASP.NET应用程序来访问。当用户试图从T1中删除记录时,该语句会超时。所以我们决定先删除引用T1的表中的记录,然后删除T1中的记录。问题是从T1删除的速度不如预期那么快。SQL删除花费时间过长
我的问题是:即使记录本身没有任何'子女'记录,从很多其他表引用的表中删除这么耗时是否正常?
编辑:显然,超时的原因不是删除本身,而是从相同的DataContext检索数据的另一个查询。感谢您的建议,我已标记为回答为所有外键添加索引的建议,因为它改进了我们脚本的执行计划。
您应该尝试在delete语句上运行查询分析器。大多数SQL Server实现都包含一个分析器,它将向您显示执行计划,您可以直接确定瓶颈,而不是让人们猜测速度是否是“正常”,这是一个非常主观,模糊的术语。 –
您是否尝试过运行SQL Profiler来查看这些调用期间发生了什么?您可以获取SQL,然后运行执行计划并查看延迟的位置。 –
你的外键有索引吗?看到这个老板栗:http://zootfroot.blogspot.com/2006/01/slow-sql-server-delete.html –