60

初期ロード時に SQL サーバーからアイテムのリストを取得する ASP.NET Web ページ ページを実行しています。このクエリは 1 秒ほどで実行され、2 秒以内にページが読み込まれます。リターンは約 1000 レコード、ギブ オア テイクです。Service Manager SQL データベースからホスト名を他の情報と一緒に取得しています。

このページには、本質的にまったく同じクエリを実行する組み込みの検索がありますが、ホスト名に基づいて LIKE で実行します。これにより、検索クエリの一部を含むすべてのホスト名を含む同じページが読み込まれます。通常、クエリは SQL Management Studio 内で 1 秒未満で実行されますが、ページの読み込みにはかなりの時間がかかり、タイムアウトになることもあります。

私の質問は、なぜパラメータベースの検索に時間がかかり、明確な理由もなくタイムアウトすることがあるのか​​ということです。このタイムアウトを軽減するために実行できる手順はありますか? 以下は完全なエラーです。

「/」アプリケーションでサーバー エラーが発生しました。


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」は、接続文字列の「接続タイムアウト」とは異なり、コマンドごとに設定する必要があります。

SQL Selecting Event で、次のコマンドを使用します。

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 などで立ち往生している人には役立つかもしれません。電話を取るのは個人次第です。はい、クエリを強制終了しますが、VM マシンが破壊されるのを防ぎました。

Serverstack はすでに同様の質問に回答しています。VMマシン上のSQLに関する問題を解決しました。こちらをご確認ください

インデックスの問題を修正するには、次のコマンドを実行する必要があります。

exec sp_updatestats
于 2013-09-19T10:09:47.227 に答える
6

同じ問題がありました。ランニングexec sp_updatestatsは時々うまくいきましたが、常にではありませんでした。NOLOCKクエリを高速化するために、クエリでステートメントを使用することにしました。NOLOCKFROM 句の後に追加するだけです。

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 に答える
2

2008 から 2014 SQL Server へのアップグレード後にこのエラーが発生しました。ローカル開発用の以前の接続文字列の一部には、このような Data Source=./ がありました。

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

それを ./ から (ローカル) または 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

@JonSchneiderの回答のEfCoreバージョン

myDbContext.Database.SetCommandTimeout(999);

myDbContext は DbContext インスタンスで、999 は秒単位のタイムアウト値です。

(Entity Framework Core 3.1 現在の構文)

于 2020-07-08T09:39:02.490 に答える
0

私たちの場合、原因をいくつかのビューに絞り込むことができましWITH SCHEMABINDINGた。これによりパフォーマンスが向上するはずですが、ひどいクエリ プランが発生しました (これらのビューによって参照されているテーブルで単一のレコード更新を実行すると、2 秒近くの経過時間がかかりました)。削除WITH SCHEMABINDINGすると、すべてが再びスムーズに実行され、「待機操作がタイムアウトしました」というエラーがなくなりました。

于 2020-10-01T11:06:10.743 に答える