拡張イベントについて確認する

完了

Azure SQL の拡張イベント エンジンは、データベースやサーバーのアクティビティに関する詳細情報をキャプチャできる軽量で強力な監視システムです。 Azure プラットフォームの監視ソリューションにより、環境の強力な監視機能を簡単に構成し、エラー条件に自動的に対応することができます。

拡張イベントは、クエリをトレースしたり、監視できる追加データ (イベント) を公開したりできるようにすることで、SQL Server Profiler の機能を基に構築されています。 拡張イベントでトラブルシューティングを行うことができる問題の例を次に示します。

  • ブロックとデッドロックによるパフォーマンスの問題のトラブルシューティング。
  • 実行時間の長いクエリの特定。
  • データ定義言語 (DDL) 操作の監視。
  • 欠落した列統計の記録。
  • データベースのメモリ不足の観察。
  • 実行時間の長い物理 I/O 操作。

拡張イベント フレームワークでは、データ収集のオーバーヘッドを減らすためにフィルターを使用して収集するデータの量を制限することもできます。また、特定の領域に焦点を当てることによって、パフォーマンスの問題をより簡単に特定できます。

Azure SQL Database 上で作成された拡張イベント セッションの例を次に示します。

Extended Event running on a SQL Database

上の画像では、xe_deadlocksAdventureWorks データベース上で実行されている拡張イベント セッションの名前です (画像の左側)。 イベント セッション ノードの下にある event_counter ターゲット ノードで、イベント セッション内の各イベントの発生回数をカウントします。 SSMS オブジェクト エクスプローラーでターゲット データを表示するには、ターゲット ノードを右クリックし、[View Target Data](ターゲット データの表示) を選びます。 SSMS には、この画像の左側のようなデータと、各イベントのカウント結果が表示されます。

Azure SQL Database の拡張イベントについては、「Azure SQL データベースでの拡張イベント」を参照してください。

拡張イベントで何を監視できますか。

拡張イベントは、SQL Server のすべての外部からのアクセスを対象とし、イベントの対象を定義する 4 つのチャネルに分割されます。

  • 管理 - 管理イベントは、エンド ユーザーと管理者を対象としています。 含まれるイベントは、管理者が実行できる明確に定義された一連のアクション内の問題を示します。 この例として、デッドロックの根本原因を識別するのに役立つ XML デッドロック レポートの生成があります。
  • 操作 - 操作イベントは、分析と診断、または一般的な問題に使用されます。 これらのイベントは、イベントの発生に基づいてアクションまたはタスクをトリガーするために使用できます。 操作イベントの例としては、状態が変化する可用性グループ内のデータベースが挙げられ、これはフェールオーバーを示します。
  • 分析 - 分析イベントは通常、パフォーマンス イベントに関連しており、大量に発行されます。 分析イベントの例として、ストアド プロシージャやクエリ実行のトレースがあります。
  • デバッグ - デバッグ イベントは、必ずしも完全に文書化されるわけではなく、Microsoft サポートと連携してトラブルシューティングを行う場合にのみ使用してください。

イベントは、複数のイベントをホストできるセッションに追加されます。 通常の場合、関連する一連の情報を取り込むために、複数のイベントが 1 つのセッションにまとめられます。

次のクエリを実行すると、使用できるイベント、アクション、ターゲットの一覧を取得できます。

SELECT
    obj.object_type,
    pkg.name AS [package_name],
    obj.name AS [object_name],
    obj.description AS [description]
FROM sys.dm_xe_objects  AS obj
    INNER JOIN sys.dm_xe_packages AS pkg  ON pkg.guid = obj.package_guid
WHERE obj.object_type in ('action',  'event',  'target')
ORDER BY obj.object_type,
    pkg.name,
    obj.name;

拡張イベント セッションを作成する

ここでは、SQL Server Management Studio の [新しいセッション] ダイアログを使用して拡張イベント セッションを作成する基本的なプロセスについて説明します。 この画面を表示するには、SSMS で [管理] ノードを展開し、[拡張イベント] ノードを展開して、[セッション] を右クリックし、[新しいセッション] を選択します。

Creating an Extended Events Session

上の画像は、拡張イベント機能の [新しいセッション] ダイアログです。 まず、セッションに名前を指定する必要があります。 SQL Server には、次のカテゴリにグループ化された多数のテンプレートが用意されています。

  • ロックとブロック
  • Profiler 相当物
  • クエリの実行
  • システム監視

これらの定義済みテンプレートを使用すると、監視用の拡張イベントの使用をすばやく開始できます。 この例では、セッションに手動で追加されたイベントを使用してすべてのオプションを確認しますが、自分で作業を開始する際は、テンプレートを使用すると、基本的なセッションを簡単に作成できます。

このセッションを開始するタイミングには、2 つのチェック ボックスのオプションがあります。 サーバーを起動するたびに新しいセッションを開始するように選択できます。また、セッションが作成されたらすぐにセッションを開始するように選択することもできます。 管理者は、SQL Server Management Studio の [拡張イベント] ノードを使用していつでも拡張イベント セッションを開始および停止できます。 また、因果関係の追跡を有効にすることもできます。これにより、グローバル一意識別子 (GUID) とシーケンス番号が各イベントの出力に追加されるため、イベントが発生した順序の流れを簡単に確認できます。

Event selection in SQL Server Management Studio

上の図は、セッションにイベントを追加する画面を示しています。 イベントは、データベース エンジン コード内の肝心な点を表します。つまり、純粋に内部システム操作を表すこともあれば、クエリ実行のようなユーザー操作に関連する場合もあります。 上の例では、このイベント セッションにイベント sp_statement_completedsql_batch_completedsql_statement_completed が追加されていることを確認できます。 既定では、このセッションでは、インスタンスで発生したこれらのイベントのすべてのインスタンスがキャプチャされます。 [構成] ボタンをクリックして、コレクションを制限することができます。

Global event selection

[イベントの構成] 画面では、イベントに関連して収集するデータを定義できます。 グローバル フィールドでは、イベントが発生したときに収集するデータを選択できます。 グローバル フィールドはアクションとも呼ばれます。これは、アクションはデータ フィールドをイベントに追加するものであるためです。 これらのフィールドは、拡張イベントが発生したときに収集されるデータを表し、ほとんどの拡張イベントで共通しています。 下の画像は、拡張イベントのフィルター オプションを示しています。

Event filter in SQL Server Management Studio

フィルターは拡張イベントの強力な機能であり、詳細な制御を使用して、キャプチャするイベントの特定の発生のみをキャプチャできます。 この例では、0 に等しい sqlserver.is_system フィールドにフィルターが適用されていることを確認できます。これは、クエリが内部操作ではないことを示します。 つまり、システム接続によって送信されたステートメントの完了は、このセッションではキャプチャされません。ここでは、ユーザーまたはユーザー アプリケーションによって送信されたステートメントのみをキャプチャする必要があります。

フィルターは、1 つのイベントの 1 つのフィールドに適用されます。 どのイベントでもシステム アクティビティをトレースしないようにするには、sql_statement_completed イベント用、sql_batch_completed イベント用、sp_statement_completed イベント用にそれぞれ別のフィルターが必要になります。

キャプチャするイベントごとにフィルターを構成することをお勧めします。 これにより、データ収集の効率が向上し、検索の焦点を絞ることができます。

下の画像は、収集されるイベント フィールドを示しています。 これらは、トリガーされるイベントに固有のものであり、コレクションのオプション フィールドを含めることができます。 上記のイベントでは、省略可能なコレクション オプションは、statementparameterized_plan_handle であることがわかります。

Event fields selection

イベント セッションを定義したら、以下の画像に示すようにストレージ ターゲットを定義します。

Storage target selection for Extended Events

拡張イベント セッションにはターゲットがあります。ターゲットは、エンジンがイベントの発生を追跡する場所であると単純に考えることができます。 より一般的なターゲットを 2 つ挙げると、イベントを格納できるファイル システム上のファイルである "イベント ファイル" と、Azure SQL PaaS オファリングではこのデータが BLOB ストレージに書き込まれるものがあります。 もう 1 つの一般的なターゲットは、SQL Server のメモリ内にある "リング バッファー" です。 "リング バッファー" は、イベント セッションをライブ監視するために最もよく使用されます。これは循環バッファーであり、データはセッションをまたいで保持されないためです。 ほとんどのターゲットではデータが非同期的に処理されます。これは、イベント データはディスクに保持される前にメモリに書き込まれることを意味します。 例外は、Event Tracing for Windows ターゲット (ETW) とイベント カウンター ターゲットで、これらは同期的に処理されます。

次の表に、拡張イベント ターゲットの種類ごとの情報と使用方法を示します。

移行先 説明 処理
イベント カウンター 拡張イベント セッション中に発生したすべてのイベントをカウントします。 これは、完全なイベント コレクションのオーバーヘッドを発生させずにワークロードの特性に関する情報を取得するために使用されます。 Synchronous
イベント ファイル イベントセッションの出力を、メモリからディスク上の永続ファイルに書き込みます。 非同期
イベント ペアリング 多くのイベントは、通常ペアで発生するため (ロックの取得、ロックの解放など)、このコレクションを使用すると、それらのイベントが対応するセットで発生しなかった場合を特定できます。 非同期
Windows イベント トレーシング (ETW) SQL Server イベントを Windows OS イベント データと関連付けるために使用されます。 Synchronous
ヒストグラム これはイベントの発生をカウントするイベント カウンターに似ています。 違いは、ヒストグラムは特定のイベント列またはアクションに基づいてカウントできることです。 非同期
リング バッファー メモリにデータを保持するために使用されます。 データはディスクに保持されず、バッファーから頻繁にフラッシュされることがあります。 非同期

また、T-SQL を使って拡張イベント セッションを作成することもできます。 次の T-SQL コマンドは、拡張イベント セッションを作成する方法の例を示しています。

IF EXISTS (SELECT * FROM sys.server_event_sessions WHERE name='test_session')
    DROP EVENT session test_session ON SERVER;
GO

CREATE EVENT SESSION test_session
ON SERVER
    ADD EVENT sqlos.async_io_requested,
    ADD EVENT sqlserver.lock_acquired
    ADD TARGET package0.etw_classic_sync_target (SET default_etw_session_logfile_path = N'C:\demo\traces\sqletw.etl' )
    WITH (MAX_MEMORY=4MB, MAX_EVENT_SIZE=4MB);
GO

イベント セッションは、サーバーまたはデータベースにスコープを設定できます。 上記の例では、2 つのイベントを追加し、Event Tracing for Windows (ETW) パスを使用して、ファイルの場所を指定しています。 セッションを作成したら、セッションを開始する必要があります。 これは T-SQL を使って実行できます。また、STATE オプションを使ってセッションの ALTER を実行するか、そのために SQL Server Management Studio を使うことができます。