web-dev-qa-db-ja.com

Sql Server Profilerの「exec sp_reset_connection」とはどういう意味ですか?

「sp_reset_connection」を発行して、SQLプロファイラの意味を理解しようとしています。

次の「exec sp_reset_connection」行の後にBatchStartingとCompletedがあります。

RPC:Completed       exec sp_reset_connection
SQL:BatchStarting   SELECT [c].[TestID] AS [TestID], [c].[Description] AS [Description] FROM [dbo].[Test] AS [c]
SQL:BatchCompleted  SELECT [c].[TestID] AS [TestID], [c].[Description] AS [Description] FROM [dbo].[Test] AS [c]    

基本的に、最初の行「exec sp_reset_connection」はプロセス全体(接続が開かれ、選択されたstmtが実行され、接続が閉じられてプールに戻される)が行われることを意味しますか?または、私の接続はまだオープンステージです。

そして、なぜ私自身のselect文の前にsp_reset_connectionが実行されるのですか、それはユーザーのSQLの後にリセットされるべきではないのですか?

接続が開かれたときと閉じられたときをより詳細に知る方法はありますか?

「exec sp_reset_connection」が表示されるということは、接続が閉じられているということですか?

165
Ray

他の回答と同様に、sp_reset_connectionは接続プールが再利用されていることを示します。 1つの特定の結果に注意してください!

Jimmy MaysのMSDNブログ

sp_reset_connectionは、トランザクション分離レベルを以前の接続の設定からサーバーのデフォルトにリセットしません。

UPDATE:SQL 2014以降、TDSバージョン7.3以降のクライアントドライバーの場合、トランザクション分離レベルはデフォルトにリセットされます。

ref: SQL Server:プールされた接続での分離レベルのリーク

追加情報を次に示します。

sp_reset_connectionの機能

ODBC、OLE-DB、System.Data.SqlClientなどのデータアクセスAPIのレイヤーはすべて、接続プールからの接続を再利用するときに(内部)ストアドプロシージャsp_reset_connectionを呼び出します。再接続する前に接続の状態をリセットするためにこれを行いますが、リセットされる内容についてはどこにも文書化されていません。この記事では、接続のリセットされる部分を文書化しようとします。

sp_reset_connectionは、接続の次の側面をリセットします。

  • すべてのエラー状態と番号(@@ errorなど)

  • 並列クエリを実行する親ECの子スレッドであるすべてのEC(実行コンテキスト)を停止します

  • 未処理の未処理のI/O操作を待機します

  • 接続によってサーバー上の保持されているバッファを解放します

  • 接続で使用されているバッファリソースのロックを解除します

  • 接続が所有するすべての割り当て済みメモリを解放します

  • 接続によって作成された作業テーブルまたは一時テーブルをクリアします

  • 接続が所有するすべてのグローバルカーソルを強制終了します。

  • 開いているSQL-XMLハンドルをすべて閉じます

  • 開いているSQL-XML関連の作業表を削除します

  • すべてのシステムテーブルを閉じます

  • すべてのユーザーテーブルを閉じます

  • すべての一時オブジェクトを削除します

  • オープントランザクションを中止します

  • 参加時の分散トランザクションからの障害

  • 共有データベースのロックを解除する現在のデータベースのユーザーの参照カウントをデクリメントします

  • 獲得したロックを解放します

  • 取得したハンドルを解放します

  • すべてのSETオプションをデフォルト値にリセットします

  • @@ rowcount値をリセットします

  • @@ identity値をリセットします

  • Dbcc traceon()を使用して、セッションレベルのトレースオプションをリセットします。

  • SQL Server 2005以降でCONTEXT_INFOをNULLにリセットします [元の記事の一部ではない]

sp_reset_connectionはリセットされません:

  • セキュリティコンテキスト。接続プールが正確な接続文字列に基づいて接続と一致する理由

  • アプリケーションロールは元に戻せないため、sp_setapproleを使用して入力されたアプリケーションロール

注:一時的なWebでリストが失われないように、ここにリストを含めています。

189
ram

接続プーリングが使用されていることを示しています(これは良いことです)。

21
Mitch Wheat

ただし、注意してください:

ストアドプロシージャまたはトリガーでSET TRANSACTION ISOLATION LEVELを発行すると、オブジェクトが制御を返すと、分離レベルはオブジェクトが呼び出されたときに有効だったレベルにリセットされます。たとえば、バッチでREPEATABLE READを設定し、そのバッチが分離レベルをSERIALIZABLEに設定するストアドプロシージャを呼び出す場合、ストアドプロシージャがバッチに制御を返すと、分離レベルの設定はREPEATABLE READに戻ります。

http://msdn.Microsoft.com/en-us/library/ms173763.aspx

9
SAO