代码一直超时
Posted
技术标签:
【中文标题】代码一直超时【英文标题】:Code Keeps Timing Out 【发布时间】:2010-12-27 15:35:53 【问题描述】:所以,我们得到了这组代码,由于某种原因,它一直超时。它运行的不是存储过程,因为它运行良好。此外,如果我们从 c# 代码中删除参数,代码就会运行。参数不断中断(导致超时),我们无法弄清楚原因。
c#:
public static PTWViewList GetList(int studynumber)
PTWViewList tempList = new PTWViewList();
using (SqlConnection myConnection = new SqlConnection(AppConfiguration.cnARDB))
string spName = "ardb.PTWViewSelect";
SqlCommand myCommand = new SqlCommand(spName, myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.AddWithValue("@study", studynumber);
myConnection.Open();
using (NullableDataReader myReader = new NullableDataReader(myCommand.ExecuteReader())) /*this is where the code times out*/
tempList = new PTWViewList();
while (myReader.Read())
tempList.Add(FillDataRecord(myReader));
myReader.Close();
tempList.ListCount = tempList.Count;
return tempList;
存储过程:
CREATE PROCEDURE [ardb].[PTWViewSelect]
@studynumber int = NULL,
@quoteid uniqueidentifier = NULL,
@lineitemid uniqueidentifier = NULL
AS
BEGIN
SET NOCOUNT ON;
SELECT
[Study]
,[LineItemID]
,[QuoteID]
,[Total]
,[COOP]
,[VendorCost]
,[CustCost]
,[LineItemNumber]
,[StudyTypeCode]
,[GroupLeader]
,[PTWDate]
,[PONumber]
,[POStatus]
,[StudyDirector]
,[SL_DESC_L]
,[SL_Code]
,ProjectDescription
,CreatedBy
,chARProcess
,CODate
FROM
[ARDB].[dbo].[PTWView]
WHERE
(@studynumber is null or StudyNumber=@studynumber)
AND (@quoteid is null or QuoteID=@quoteid)
AND (@lineitemid is null or LineItemID = @lineitemid)
END
【问题讨论】:
如果你重新添加参数并且SQL开始超时,我会说你的数据库有问题。您是否为相关列编制了索引? 如果您在 SQL Server Management Studio 中exec PTWViewSelect 4711
会发生什么?
每次都在同一点超时吗?即... 30秒?在超时发生之前执行的最后一行代码是什么?当您说它运行良好时,存储过程是在本地运行还是远程运行?
【参考方案1】:
你试过了吗
myCommand.Parameters.AddWithValue("@studynumber", studynumber);
代替:
myCommand.Parameters.AddWithValue("@study", studynumber);
【讨论】:
帮助使用正确的参数名称。但它也可能是部分模拟的代码。但即使它仍然应该抛出关于错误参数的错误,并且该错误不会是超时错误。 抱歉,从错误的服务器上复制了存储过程(与开发人员交谈,他同意这不是问题)【参考方案2】:编辑 如果传递参数是问题,那么它归结为存储过程执行所需的时间。 SQL 服务器的默认超时通常为 120 秒。您可以在数据库连接字符串中添加“连接超时”以增加超时并检查。
** 旧答案 - 忽略 ** 如果没有堆栈跟踪,并且相信存储过程很好,我猜它由于连接失败而超时。该代码无法连接到您的数据库服务器,因此超时。
【讨论】:
@Oded - 哎呀错过了这个问题 - 谢谢【参考方案3】:设置 arithabort 使 sp 需要 45 秒,而不是 1。将其重新设置为 1。我更新了存储过程以将其设置为打开,应用程序中没有任何更改。把它改成关闭了,没有变化。然后我删除了更新,然后应用程序运行良好。
我相信发生的事情是更新存储过程导致它重新编译,从而解决了问题。不过,我对此不是 100% 确定的。
【讨论】:
I updated the stored procedure to set it on
这是一个连接设置,不是 proc 设置,您必须在来自 .NET 的连接中进行
示例...MyConnection.Execute "SET ARITHABORT ON"【参考方案4】:
一件事可能是 ARITHABORT
设置,将其设置为 ON...NET 默认为 OFF
在将 ARITHABORT 设置为 OFF 的情况下在 SSMS 中运行 proc,看看它现在是否像 .NET 一样运行得更慢
例子
MyConnection.Execute "SET ARITHABORT ON"
还有一点就是你的 WHERE 子句不是最优的,看看Do you use Column=@Param OR @Param IS NULL in your WHERE clause? Don't, it doesn't perform
使用 SSMS 中的参数时,proc 是否运行缓慢?可以展示一下执行计划吗?
【讨论】:
SET ARITHABORT ON
to On 在 SQL Server 2005+ 中没有任何功能差异如果ANSI_WARNINGS
处于打开状态,那么它的行为就像它处于打开状态一样。它所做的一个区别是用作计划缓存键。因此,如果在设置为打开或关闭的执行之间观察到不同的行为,这可能是参数嗅探问题。以上是关于代码一直超时的主要内容,如果未能解决你的问题,请参考以下文章