web-dev-qa-db-ja.com

SQL Server DMVのconnection_idに関する混乱

connection_id DMVのsys.dm_exec_connections列について混乱しています。

SELECT connection_id FROM sys.dm_exec_connections;

SSMSを使用してSQL Serverのインスタンスに接続する場合、それはone物理接続のみである必要がありますか?そして、複数のNew Queryウィンドウは、異なるsession_idsまたは@@SPIDsで表される異なるセッションを表しますか?

特に、上記のクエリの結果セットが、この同じサーバー接続の各セッション(および現在開いているように見えるセッション)ごとに異なるuniqueidentifierを返すのはなぜですか?

この接続は、SQL Serverのインスタンスへのphysical接続と同じですか?

ありがとう

2
John Smith

SSMSを使用してSQL Serverのインスタンスに接続する場合、それはone物理接続のみである必要がありますか?

まあ、「インスタンスへの接続」によって実際に何を意味するのかを最初に明確にすると役立つと思います。 SSMSの起動について言及していて、インスタンスへの接続を要求していると想定します。これが発生した場合、少なくともオブジェクトエクスプローラーが接続を確立しています。そして、最初に接続したとき、2〜4の接続/セッションを使用しているように見えます。しばらくすると、それらの接続の1つを除いてすべてがドロップしたように見えます。これらの接続は、表示する情報を収集するオブジェクトエクスプローラーのさまざまなスレッドです。また、しばらくの間接続が継続しているという動作は、接続プールが使用されていることを示しています。

「オブジェクトエクスプローラーの詳細」タブがある場合、特に下部にあるオブジェクトごとの詳細を取得するためにさまざまなオブジェクトをクリックしている場合は、別の接続を1つまたは2つ使用できます。

connectedクエリウィンドウは、さらに別の接続になります。

「プロパティ」ウィンドウを開き(オブジェクトエクスプローラーでデータベースを右クリックし、[プロパティ]を選択して[データベースのプロパティ]ダイアログを開くなど)、これが1つまたは2つの接続になります。

IntelliSenseが有効になっている場合(デフォルト)、情報を収集して接続を切断する場合があります。

次のテストを行うことにより、これらの動作を確認できます。

  1. SSMSを完全に閉じます。
  2. SSMSを開きますが、「サーバーに接続」するように求められたら、「キャンセル」ボタンをクリックします。
  3. [新しいクエリ]ボタンをクリックして、サーバーに接続します。
  4. 次のクエリにすぐに貼り付けてヒット F5

    SELECT conn.[connection_id], sess.[program_name], txt.[text] AS [most_recent_batch],
           '---' AS '---',
           sess.*,
           '---' AS '---',
           conn.*
    FROM   sys.dm_exec_sessions sess
    LEFT JOIN sys.dm_exec_connections conn
           ON conn.[session_id] = sess.[session_id]
    OUTER APPLY sys.dm_exec_sql_text(conn.[most_recent_sql_handle]) txt;
    

    このクエリは、すべてのセッションとそれぞれの接続を示します(セッションがある場合)。また、最新のクエリバッチも表示され、その接続がどのように使用されているかを確認できます。

  5. 結果リストの一番下までスクロールすると、「program_name」の値が次の1行になっているはずです。
    Microsoft SQL Server Management Studio
    (Ibelieve実際には「Microsoft SQL Server Management Studio-Query」である必要がありますが、これはSSMS 17.0での動作です)

  6. 今ヒット F5 もう一度、結果リストの一番下までスクロールすると、「program_name」の次の値を含む追加の行が表示されます。
    Microsoft SQL Server Management Studio-Transact-SQL IntelliSense
    実行の間にあまり長く待たないでください。そうしないと、見逃す可能性があります。
  7. [新しいクエリ]ボタンをクリックして、最初のクエリタブに戻り、 F5 もう一度、結果リストの一番下までスクロールすると、「program_name」の次の値を含む追加の行が表示されます。
    Microsoft SQL Server Management Studio-クエリ
  8. 最近開いたクエリタブに戻り、上記のクエリ(ステップ#4)を貼り付け、元のクエリタブを閉じて、 F5、結果リストの一番下までスクロールすると、「program_name」の値が次の1行になっているはずです。
    Microsoft SQL Server Management Studio-クエリ
  9. オブジェクトエクスプローラーパネルに移動して、インスタンスに接続します。
  10. クエリタブに戻り、 F5、結果リストの一番下までスクロールすると、「program_name」の値が次の2行以上あるはずです。
    Microsoft SQL Server Management Studio
    [オブジェクトエクスプローラーの詳細]タブがある場合は、そのための別の接続が必要です(つまり、少なくとも3つの非 "-Query"接続)。
2
Solomon Rutzky

SSMSの最新バージョンを接続すると、SSMSはバックグラウンド接続を使用してインスタンスとそのデータベースからさまざまなアイテムを列挙するため、サーバーに対して複数の接続が開かれます。また、開いているクエリウィンドウごとに少なくとも1つの接続があります。

Dm_exec_connectionsの各行は、サーバーへの単一の物理接続を表します。各セッションには単一の接続があります。詳細は https://docs.Microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-exec-connections-transact-sql を参照してください。

1
Max Vernon