导致超时的最基本的T-SQL DELETE语句



这将是我见过的一些最奇怪的事情。我试着查找"导致超时的简单t-sql删除",但所有标题都有误导性,他们说很简单,但事实并非如此。它们处理删除数百万条记录或设置复杂的关系。我没有。

我有四张桌子:

tbl InterchangeControl,tblFunctionalGroup,tblTransactionSet,tbl段

后者3都通过InterchangeControlID与tblInterchangeConrol关联。没有设置关系。就像我说的一样简单。

该过程在所有4个表上运行一个delete语句,如so…

DELETE FROM tblSegment 
WHERE (ID_InterchangeControlID = @InterchangeControlID)
DELETE FROM tblTransactionSet 
WHERE (ID_InterchangeControlID = @InterchangeControlID)
DELETE FROM tblFunctionalGroup 
WHERE (ID_InterchangeControlID = @InterchangeControlID)
DELETE FROM tblInterchangeControl 
WHERE (InterchangeControlID = @InterchangeControlID)

奇怪的是,如果我把它们留在手术中,它就会超时,如果我去掉它们,它就不会。我已经把它固定在这些删除语句上,这就是原因。但是为什么?!

我之所以包含c#,是因为我从c#应用程序调用此过程。我不认为这是问题所在,但也许吧。我只是说我不这么认为,因为当我删除存储过程中的delete语句时,我的代码工作得很好。然后,如果我把它们放回去,就会抛出一个超时的异常。

如果我的评论就是答案
很可能你有一些锁来阻止这些删除。

如果从命令行SQL工具或SQL Management Studio运行查询,则需要完成所需的任何操作。所以,是的,很可能是客户部分的问题。而且,因为您提到了c#,所以可能是ADO.NET命令超时。

此外,我建议通过检查查询的执行计划来对查询进行概要分析。如果您没有索引(主键/唯一键约束),这将导致完全扫描,即您不想要的O(n)操作。

更新:好的,看起来是ADO.NET错误。在您的代码中,就在执行命令之前增加超时:

var myCommand = new SqlCommand("EXEC ..."); // you create it something like this
....
myCommand.CommandTimeout = 300; // 5 minutes
myCommand.ExecuteNonReader(); // assuming your SP doesn't return anything

最新更新