Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 过程从ADO.NET超时,但不在SSMS中超时_Sql Server 2005_Ado.net_Timeout_Ssms_Sqlexception - Fatal编程技术网

Sql server 2005 过程从ADO.NET超时,但不在SSMS中超时

Sql server 2005 过程从ADO.NET超时,但不在SSMS中超时,sql-server-2005,ado.net,timeout,ssms,sqlexception,Sql Server 2005,Ado.net,Timeout,Ssms,Sqlexception,我有一个存储过程,它给我一个SqlException,因为当我从代码运行它时超时(超时设置为30)。当我直接在ManagementStudio中运行该过程时,它将在不到1秒的时间内执行。我也只在针对特定数据库运行时获得超时。当我使用其他数据库时,它很快就完成了,没有错误。以下是完整的错误消息: System.Data.SqlClient.SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to

我有一个存储过程,它给我一个SqlException,因为当我从代码运行它时超时(超时设置为30)。当我直接在ManagementStudio中运行该过程时,它将在不到1秒的时间内执行。我也只在针对特定数据库运行时获得超时。当我使用其他数据库时,它很快就完成了,没有错误。以下是完整的错误消息:

System.Data.SqlClient.SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
这个堆栈跟踪对任何人都有意义吗?看起来可能是我的存储过程完成了,在尝试读取某种元数据时超时了


我尝试在进程运行时查看它,但它被挂起。sys.dm_os_waiting_tasks将等待类型显示为IO_COMPLETION(如果有任何用处)。我在使用sp_who2“active”的数据库上看到的唯一进程是超时和我的活动SSMS窗口,因此我认为这不是阻塞问题。我验证了该数据库与工作数据库具有相同的索引,并在没有任何错误的情况下运行了dbcc checkdb。如何确定超时的原因?

您可以将超时会话的设置选项与非超时会话的设置选项进行比较:

SELECT
    session_id,
    [ansi_defaults],
    [ansi_null_dflt_on],
    [ansi_nulls],
    [ansi_padding],
    [ansi_warnings],
    [arithabort],
    [concat_null_yields_null],
    [deadlock_priority],
    [quoted_identifier],
    [transaction_isolation_level]
FROM
    sys.dm_exec_sessions
WHERE
    session_id IN (<spid1>, <spid2>);
选择
会话id,
[ansi_默认值],
[ansi_null_dflt_on],
[ansi_nulls],
[ansi_padding],
[ansi_警告],
[arithabort],
[concat_null_产生_null],
[死锁\u优先级],
[quoted_标识符],
[事务隔离级别]
从…起
sys.dm_exec_会话
哪里
会话id位于(,);

当您发现一些不同时,尝试将SSMS查询中的每个设置更改为相反的设置,直到您获得超时(或在发送查询之前在应用程序代码中手动设置选项)。现在,我手头没有2005年的实例,所以我没有测试这个查询。您可能需要注释掉一个或多个列名。

您是否使用应用程序使用的相同凭据登录SSMS?可能存在重复的。你可以看看我对一个类似问题的回答,这也是一个很好的问题,但是我不想重新编写我所有的过程来将输入参数值传递给局部变量。OP的问题似乎是
ARITHABORT
设置的差异,但实际上可能是任何
SET
选项导致了不同的计划。David,我在SSMS中使用的是我的windows帐户,但应用程序中的SQL用户。请看我对下面答案的回复。谢谢Aaron。唯一的区别是arithabort,该应用程序已关闭。我试着把它设置为on,但没有加速。我需要从上面的帖子中澄清一个细节,因为我似乎做了一个错误的假设。在SSMS中,我通过硬编码存储过程的参数来执行SQL。我发现,如果我在SSMS中实际执行存储过程并传入参数,则需要35-38秒才能运行,这将超时。那么,为什么运行SQL会立即执行,但通过存储过程运行它会执行慢35倍呢?您需要检查执行计划。缓存的计划可能不是最佳的,这可能是由于当时的统计数据不同、参数不典型等原因。请尝试使用重新编译将
添加到存储过程中(或删除并重新创建),以查看这是否对性能有任何影响。执行计划似乎略有不同(我真的不知道我在看什么)。高效循环中有一个嵌套循环,其中另一个循环中有一个哈希匹配,并且一些成本百分比不同。因此,我删除并重新创建了它。这使它在SSM之外快速执行,运行速度足够快,不会超时,但在应用程序中仍需要20-25秒。在进行更多测试时g为了确定arith abort现在是否是问题所在,我再次修改了存储过程,现在在SSMS和SQL中恢复到30秒以上。