2

ストアド プロシージャを使用してレコードを取得し、グリッドに表示しています。

初めて、例外がスローされます。

タイムアウトになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。

スタックトレース

System.Data.SqlClient.SqlConnection.OnError (SqlException 例外、ブール型 breakConnection)
で System.Data.SqlClient.SqlInternalConnection.OnError (SqlException 例外、ブール型 breakConnection)
で System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
で System.Data
System.Data.SqlClient.SqlDataReader.ConsumeMetaData()のSystem.Data.SqlClient.SqlDataReader.get_MetaData
()
の System.Data.Data .SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior、RunBehavior runBehavior、ブール値 returnStream、ブール値 async)
で System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior、RunBehavior runBehavior、ブール値 returnStream、文字列メソッド、DbAsyncResult 結果)
でSystem.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior runBehavior、Boolean returnStream、String メソッド)
で System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 動作、String メソッド)
で System.Data.SqlClient.SqlCommand.ExecuteReader( )

使った

SELECT * 
FROM sys.dm_tran_session_transactions

データベースに現在アクティブなトランザクションがいくつあるかを確認するために、何も見つかりませんでした。

2 回目以降、このストアド プロシージャは完全に実行されます (タイムアウト例外はスローされません)。この動作の原因は何ですか?

4

1 に答える 1

2

ストアド プロシージャが複雑な場合、またはデータベースの設計が不十分な場合 (インデックスの不足など)、SQL Server は最適な実行計画を思いつくことができず、すべてのオプションを評価できない可能性があります。それは何かを選ぶことができます。所要時間は、タイムアウト制限を超える可能性があります。

2 回目は、同じストアド プロシージャを実行しているため、SQL Server は最初に実行したすべての作業を保持し、オプションの評価を終了して、別のタイムアウトになる前にデータを返すことができます。

私はこのようなprocを持っています。サーバーを再起動すると、最初にprocを実行すると常にタイムアウトになりますが、2回目は常に機能します。

于 2012-07-26T09:55:49.863 に答える