web-dev-qa-db-ja.com

T-SQLでのみSSMSのアクティビティを監視する方法

次のステートメントを使用して、SQL Serverのアクティビティを監視します(これは一部の本には含まれていません)。

SELECT 
    des.session_id ,
    des.status ,
    des.login_name ,
    des.[Host_NAME] ,
    der.blocking_session_id ,
    DB_NAME(der.database_id) AS database_name ,
    der.command ,
    des.cpu_time ,
    des.reads ,
    des.writes ,
    dec.last_write ,
    des.[program_name] ,
    der.wait_type ,
    der.wait_time ,
    der.last_wait_type ,
    der.wait_resource ,
    CASE des.transaction_isolation_level
        WHEN 0 THEN 'Unspecified'
        WHEN 1 THEN 'ReadUncommitted'
        WHEN 2 THEN 'ReadCommitted'
        WHEN 3 THEN 'Repeatable'
        WHEN 4 THEN 'Serializable'
        WHEN 5 THEN 'Snapshot'
    END AS transaction_isolation_level ,
    OBJECT_NAME(dest.objectid, der.database_id) AS OBJECT_NAME ,
    SUBSTRING(dest.text, der.statement_start_offset / 2,
    ( CASE WHEN der.statement_end_offset = -1
    THEN DATALENGTH(dest.text) ELSE der.statement_end_offset
    END - der.statement_start_offset ) / 2 + 1)
    AS [executing statement] ,
    deqp.query_plan
FROM sys.dm_exec_sessions des
LEFT JOIN sys.dm_exec_requests der
ON des.session_id = der.session_id
LEFT JOIN sys.dm_exec_connections dec
ON des.session_id = dec.session_id
CROSS APPLY sys.dm_exec_sql_text(der.sql_handle) dest
CROSS APPLY sys.dm_exec_query_plan(der.plan_handle) deqp
WHERE des.session_id <> @@SPID
ORDER BY 3

一部のアクティビティはここには表示されません:インデックスの作成、テーブルの変更...

SQL Serverのすべてのアクティビティを監視するにはどうすればよいですか? (アクティビティモニター/プロファイラーはオプションなし-プレーンT-SQLのみ、sysadminなし-サーバー状態の表示のみ)

3
Christian4145

すべてのアクションに実行計画があるわけではありません。クロスアプライをアウターアプライに変更すると、これらの他のアイテムを表示できます。

SELECT 
des.session_id ,
des.status ,
des.login_name ,
des.[Host_NAME] ,
der.blocking_session_id ,
DB_NAME(der.database_id) AS database_name ,
der.command ,
des.cpu_time ,
des.reads ,
des.writes ,
dec.last_write ,
des.[program_name] ,
der.wait_type ,
der.wait_time ,
der.last_wait_type ,
der.wait_resource ,
CASE des.transaction_isolation_level
    WHEN 0 THEN 'Unspecified'
    WHEN 1 THEN 'ReadUncommitted'
    WHEN 2 THEN 'ReadCommitted'
    WHEN 3 THEN 'Repeatable'
    WHEN 4 THEN 'Serializable'
    WHEN 5 THEN 'Snapshot'
END AS transaction_isolation_level ,
OBJECT_NAME(dest.objectid, der.database_id) AS OBJECT_NAME ,
SUBSTRING(dest.text, der.statement_start_offset / 2,
( CASE WHEN der.statement_end_offset = -1
THEN DATALENGTH(dest.text) ELSE der.statement_end_offset
END - der.statement_start_offset ) / 2 + 1)
AS [executing statement] ,
deqp.query_plan
FROM sys.dm_exec_sessions des
INNER JOIN sys.dm_exec_requests der
ON des.session_id = der.session_id
LEFT JOIN sys.dm_exec_connections dec
ON des.session_id = dec.session_id
OUTER APPLY sys.dm_exec_sql_text(der.sql_handle) dest
OUTER APPLY sys.dm_exec_query_plan(der.plan_handle) deqp
WHERE des.session_id <> @@SPID and des.is_user_process = 1
ORDER BY 3

または、実行時間、計画、現在待機中のタスク(内容と期間)などの情報のヒープを提供するストアドプロシージャであるAdam Machanicによる sp_whoisactive を参照することをお勧めします

5
Simon Hellings

いくつかの一般的な方法は次のとおりです。

sp_WhoIsActive

Adam Machanicのほぼ業界標準のツールです。 WhoIsActive.com からダウンロードし、マスターデータベースにインストールして(どこからでも呼び出すことができます)、現在何が実行されているかを知りたいときに実行します。これは次のようになります。

sp_WhoIsActive

クエリは、実行時間の長いものから短いものへと並べ替えられます。 sql_textまたはquery_planをクリックしてその内容を確認できます(後者は@get_plans = 1で実行した場合にのみ含まれることに注意してください)。また、誰が誰をブロックしているか、どのマシンからクエリが送信されているかなども表示されます。

これは無料で、現在サポートされているすべてのバージョンのSQL Serverで動作します。世界中の何千ものデータベース専門家が使用しています。私はあちこちで自分自身の生産でそれを使用しました、そしてそれで問題がなかったことがあります。

sp_BlitzWho

エリックダーリングがこれを書いたのは、クエリのチューニングに真剣に取り組んでおり、sp_WhoIsActiveが提供するよりも詳細を確認したかったためです。 SQL Server 2012以降、Microsoftはメモリ許可の使用率などのすばらしいDMV情報を大量に追加しましたが、Adamはそれを活用するためにsp_WhoIsActiveを更新していません。 sp_BlitzWhoは パブリックGithubリポ または 私たちのファーストレスポンダーキット から取得できます。これは次のようになります。

sp_BlitzWho

最初は、基本的にはsp_WhoIsActiveのように見えますが、次のような追加の列が表示されます。

  • 並列処理-last_dop、min_dop、max_dop、last_reserved_threads、min_reserved_threads、last_used_threadsなど
  • メモリ許可-last_grant_kb、min_grant_kb、max_grant_kb、last_used_grant_kb、min_used_grant_kb、max_used_grant_kb、last_ideal_grant_kbなど
  • リソースガバナー-workload_group_name、resource_pool_name

データはかなり圧倒される可能性があります-多くのデータがあるため、Adamのsp_WhoIsActiveから始めて、ライブクエリチューニングを行う必要がある場合にのみ、sp_BlitzWhoに卒業します。

sp_BlitzFirst

私はsp_BlitzFirstを書いて少し深く調べて、「なぜ今サーバーが遅いのですか?」これは、一連の動的管理オブジェクトのスナップショットを取得し、5秒待機して、別のスナップショットを取得し、2つの違いを比較して、現在何が起こっているかを把握します。 our site または public Github repo から入手できます。これは次のようになります。

enter image description here

サーバーの問題の優先順位付きリストと、ブラウザーにコピー/貼り付けして各問題の詳細を確認するためのURLが表示されます。たとえば、上のスクリーンショットでは、一部のミートボールが現在バックアップを実行しているため、サーバーの速度が低下しています。 "ClickToSeeDetails"行をクリックして、詳細を確認できます。

Backup of StackOverflow database (93GB) is 0.896017% complete, 
has been running since Sep 22 2017  5:19AM. 
Login: Brent  
Over the last 60 days, the full backup usually takes 4 minutes.

このようにして、ヘルプデスクのような経験の浅い人々にこのツールを提供して、最初のトリアージを行うことができます。

9
Brent Ozar