DBAtlas · データベース運用アトラス

Extended Events セッションを作成する: 低速クエリをファイルに記録して読み取る

SQL Serverパフォーマンス

コマンド

SET QUOTED_IDENTIFIER ON;
CREATE EVENT SESSION [dba_long_queries] ON SERVER
ADD EVENT sqlserver.sql_statement_completed (
    ACTION (sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.database_name,
            sqlserver.session_id, sqlserver.sql_text, sqlserver.username, sqlserver.query_hash)
    WHERE (duration >= 1000000 AND sqlserver.is_system = 0)),   -- 1 s (microseconds)
ADD EVENT sqlserver.rpc_completed (
    ACTION (sqlserver.client_app_name, sqlserver.client_hostname, sqlserver.database_name,
            sqlserver.session_id, sqlserver.sql_text, sqlserver.username, sqlserver.query_hash)
    WHERE (duration >= 1000000 AND sqlserver.is_system = 0))
ADD TARGET package0.event_file (SET filename = N'D:\XE\dba_long_queries.xel',
                                    max_file_size = 256, max_rollover_files = 4)
WITH (MAX_MEMORY = 8 MB, EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS,
      MAX_DISPATCH_LATENCY = 15 SECONDS, STARTUP_STATE = OFF);

ALTER EVENT SESSION [dba_long_queries] ON SERVER STATE = START;

-- Read:
SELECT x.value('(event/@name)[1]', 'sysname')                                AS event_name,
       x.value('(event/@timestamp)[1]', 'datetime2')                         AS utc_time,
       x.value('(event/data[@name="duration"]/value)[1]', 'bigint') / 1000   AS duration_ms,
       x.value('(event/data[@name="cpu_time"]/value)[1]', 'bigint') / 1000   AS cpu_ms,
       x.value('(event/data[@name="logical_reads"]/value)[1]', 'bigint')     AS logical_reads,
       x.value('(event/action[@name="database_name"]/value)[1]', 'sysname')  AS db,
       x.value('(event/action[@name="client_app_name"]/value)[1]', 'nvarchar(256)') AS app,
       x.value('(event/action[@name="sql_text"]/value)[1]', 'nvarchar(max)') AS sql_text
FROM  (SELECT CAST(event_data AS XML) AS x
       FROM sys.fn_xe_file_target_read_file(N'D:\XE\dba_long_queries*.xel', NULL, NULL, NULL)) t
ORDER BY duration_ms DESC;

-- When done:
-- ALTER EVENT SESSION [dba_long_queries] ON SERVER STATE = STOP;
-- DROP EVENT SESSION [dba_long_queries] ON SERVER;

概要

1 秒を超えるステートメントと RPC 呼び出しを、アプリケーション、ホスト、ユーザー、データベース、SQL テキストとともにディスクに書き込む軽量な Extended Events セッションを作成する。.xel ファイルを T-SQL で行に変換する。

使用する場面

断続的な低速化の苦情、Query Store では見えないクライアント詳細 (アプリ / ホスト) が必要な場合、および SQL Trace/Profiler の代替として。

注意

しきい値を非常に低くすると (例: 0)、ファイルがすぐに埋まり、高負荷サーバーではオーバーヘッドが増える。フィルタは事後ではなく WHERE 述語で行う。sql_text アクションは大量の場合コストが高い。フォルダーは SQL Server サービスアカウントが書き込み可能である必要がある。duration と cpu_time の単位はマイクロ秒。完了したらセッションを停止 / 削除する。STARTUP_STATE = OFF の場合、再起動後には開始されない。

DBAtlas で開く →

関連項目