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

时间:2015-04-03 18:44:39

标签: c# sql-server tsql

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

我有四张桌子:

tblInterchangeControl, tblFunctionalGroup, tblTransactionSet, tblSegment

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

该过程在所有4个表上运行delete语句,如此...

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语句时,我的代码工作得很好。然后,如果我把它们放回去,就会抛出一个超时的例外情况。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

如果从命令行SQL工具或SQL Management Studio运行查询,它将采取完成查询所需的任何内容。所以是的,很可能是客户端问题。而且,因为你提到了c#,它可能是ADO.NET command timeout

另外,我建议通过检查执行计划来分析查询。如果您没有索引(主要/唯一键约束),这将导致全扫描,即您不想要的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