60

我正在运行一个 ASP.NET 网页页面,该页面在初始加载时会从 SQL 服务器中提取项目列表。此查询在一秒钟左右运行并在 2 秒内加载页面。回报是大约 1000 条记录,给予或接受。我正在从 Service Manager SQL 数据库中提取主机名以及其他一些信息。

在此页面中,我内置了一个搜索,它基本上运行完全相同的查询,但使用基于主机名的 LIKE 运行它。这将加载包含搜索查询一部分的所有主机名的同一页面。查询通常在一秒钟内在 SQL Management Studio 中运行,但加载页面需要更长的时间,有时甚至会超时。

我的问题是,为什么基于参数的搜索需要更长的时间,有时甚至会无缘无故地超时。是否可以采取任何措施来缓解此超时?以下是完整的错误。

“/”应用程序中的服务器错误。


The wait operation timed out 

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详情:

System.ComponentModel.Win32Exception: The wait operation timed out
Source Error: 

Line 13:     }
Line 14:     
Line 15:     var selectedData = db.Query(selectCommand, searchTerm);
Line 16: 
Line 17:

Source File:  c:\Users\u0149920\Documents\My Web Sites\AppSupport\servers\default.cshtml    Line:  15

堆栈跟踪:

[Win32Exception (0x80004005): The wait operation timed out]
[SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +1753346
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5295154
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +242
   System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +1682
   System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() +59
   System.Data.SqlClient.SqlDataReader.get_MetaData() +90
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +365
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite) +1325
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +175
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +53
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +134
   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +41
   System.Data.Common.DbCommand.ExecuteReader() +12
   WebMatrix.Data.<QueryInternal>d__0.MoveNext() +152
   System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +381
   System.Linq.Enumerable.ToList(IEnumerable`1 source) +58
   WebMatrix.Data.Database.Query(String commandText, Object[] parameters) +103
   ASP._Page_servers_default_cshtml.Execute() in c:\Users\u0149920\Documents\My Web Sites\AppSupport\servers\default.cshtml:15
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +197
   System.Web.WebPages.WebPage.ExecutePageHierarchy(IEnumerable`1 executors) +69
   System.Web.WebPages.WebPage.ExecutePageHierarchy() +151
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +76
   System.Web.WebPages.WebPageHttpHandler.ProcessRequestInternal(HttpContextBase httpContext) +114

版本信息:Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.17929

4

11 回答 11

40

您遇到的问题是查询命令花费的时间太长。我相信执行查询的默认超时时间是 15 秒。您需要设置 CommandTimeout(以秒为单位),以便命令有足够长的时间来完成其执行。“CommandTimeout”与连接字符串中的“Connection Timeout”不同,必须为每个命令设置。

在您的 sql 选择事件中,使用以下命令:

e.Command.CommandTimeout = 60

例如:

Protected Sub SqlDataSource1_Selecting(sender As Object, e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs)
    e.Command.CommandTimeout = 60
End Sub
于 2013-12-23T08:26:34.433 回答
24

对于所有比我了解更多的人,与其将其标记为无用或误导,不如再读一遍。由于所有资源都被锁定的线程消耗,我的虚拟机 (VM) 变得无响应时遇到问题,因此终止线程是我唯一的选择。我不向任何运行长查询的人推荐这个,但可能对那些被无响应的虚拟机或其他东西困住的人有所帮助。由个人决定接听电话。是的,它会终止您的查询,但它保存了我的 VM 机器被破坏。

Serverstack 已经回答了类似的问题。它解决了我在 VM 机器上使用 SQL 的问题。请在这里查看

您需要运行以下命令来修复索引问题。

exec sp_updatestats
于 2013-09-19T10:09:47.227 回答
16

如果您使用的是Entity Framework,则可以通过执行以下操作来延长默认超时(为长时间运行的查询提供更多时间来完成):

myDbContext.Database.CommandTimeout = 300;

myDbContext您的 DbContext 实例在哪里,并且300是以秒为单位的超时值。

(实体框架 6 的当前语法。)

于 2017-03-10T20:28:53.980 回答
6

我遇到过同样的问题。跑步exec sp_updatestats有时确实有效,但并非总是如此。我决定NOLOCK在查询中使用该语句来加快查询速度。只需NOLOCK在您的 FROM 子句之后添加,例如:

SELECT clicks.entryURL, clicks.entryTime, sessions.userID
FROM sessions, clicks WITH (NOLOCK)
WHERE sessions.sessionID = clicks.sessionID AND clicks.entryTime > DATEADD(day, -1, GETDATE())

在此处阅读全文。

于 2015-09-02T15:33:51.910 回答
5

我在这里尝试了其他答案以及其他一些答案。我什至停止并重新启动了 SQL 服务。没有任何效果。

但是,重新启动我的计算机确实有效。

于 2015-04-09T19:48:53.130 回答
4

查看数据库中的重新索引表。

您可以首先找出碎片级别 - 如果它高于 10% 左右,您可以从重新索引中受益。如果它非常高,则可能会造成显着的性能瓶颈。

http://blog.sqlauthority.com/2009/01/30/sql-server-2008-2005-rebuild-every-index-of-all-tables-of-database-rebuild-index-with-fillfactor/

这应该定期进行。

于 2016-01-28T16:25:12.610 回答
2

从 2008 年升级到 2014 年 SQL Server 后,我们遇到了这个错误,我们以前用于本地开发的一些连接字符串有一个 Data Source=./ 像这样

        <add name="MyLocalDatabase" connectionString="Data Source=./;Initial Catalog=SomeCatalog;Integrated Security=SSPI;Application Name=MyApplication;"/>

将其从 ./ 更改为 (local) 或 localhost 解决了问题。

<add name="MyLocalDatabase" connectionString="Data Source=(local);Initial Catalog=SomeCatalog;Integrated Security=SSPI;Application Name=MyApplication;"/>
于 2016-02-11T16:48:14.380 回答
1

我的表没有主键,然后我有超时错误。设置键sloved后。

于 2016-10-24T10:25:46.940 回答
0

在我们的案例中,我们能够将原因缩小到WITH SCHEMABINDING对它们的一些观点。尽管这应该可以提高性能,但它却导致了一个糟糕的查询计划(在这些视图引用的表上执行单个记录更新需要将近 2 秒的经过时间)。删除WITH SCHEMABINDING意味着一切都再次顺利运行,“等待操作超时”错误已经消失。

于 2020-10-01T11:06:10.743 回答
0

我有同样的问题,通过运行“exec sp_updatestats”问题解决了,现在可以工作了

于 2021-01-14T09:19:26.883 回答
0

@JonSchneider 答案的 EfCore 版本

myDbContext.Database.SetCommandTimeout(999);

其中 myDbContext 是您的 DbContext 实例,999 是以秒为单位的超时值。

(Entity Framework Core 3.1 的当前语法)

于 2020-07-08T09:39:02.490 回答