次の方法で共有


クイック スタートの拡張イベント

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance

拡張イベントは、問題の監視とトラブルシューティングを行うために必要なデータを収集できるようにする、軽量なパフォーマンス監視システムです。 拡張イベントを使用すると、パフォーマンスの監視とトラブルシューティングの目的に関連するデータベース エンジンの内部操作の詳細を確認できます。 拡張イベントの詳細については、「拡張イベントの概要」を参照してください。

この記事は、拡張イベントを初めて使用する SQL 管理者、エンジニア、開発者を支援し、その使用を開始して数分でイベント データを表示することを目的としています。

拡張イベントは XEvent とも呼ばれ、XEだけの場合もあります、

この記事を読むと、次のことができます。

  • 例のスクリーンショットを使用して、SQL Server Management Studio (SSMS) でイベント セッションを作成する方法について説明します。
  • スクリーンショットを同等の Transact-SQL ステートメントに関連付ける。
  • SSMS ユーザー インターフェイスと XEvents T-SQL ステートメントの背後にある用語と概念について詳しく理解します。
  • イベント セッションをテストする方法について説明します。
  • 次のようなセッション結果を理解します。
    • 結果ストレージに使用できるオプション
    • 処理済み結果と生の結果の比較
    • さまざまな方法および異なる時間単位で結果を表示するためのツール
  • 使用可能なすべてのイベントを検索して検出する方法を確認します。
  • 拡張イベント システム ビュー間のリレーションシップについて理解します。

ヒント

Azure SQL Database の拡張イベントの詳細については、「Azure SQL Database および Azure SQL Managed Instance の拡張イベント」をご覧ください。

前提条件

開始するには、以下が必要です。

  • SQL Server Management Studio (SSMS) をダウンロードしてください。 最新バージョンの SSMS と最新の機能強化と修正プログラムを使用することをお勧めします。
  • アカウントに CREATE ANY EVENT SESSION (SQL Server 2022 で導入)、または ALTER ANY EVENT SESSION server アクセス許可があることを確認します。
  • さらに、SSMS を使用し、作成されたセッションを表示する場合、ログインにはアクセス許可 VIEW SERVER PERFORMANCE STATEが必要です。

拡張イベントに関するセキュリティとアクセス権に興味がある場合は、この記事の末尾にある「付録」で詳細を確認できます。

SSMS の拡張イベント

SSMS には、拡張イベント用の完全に機能するユーザー インターフェイス (UI) が用意されています。 多くのシナリオは、T-SQL または動的管理ビュー (DMV) を使用しなくても、この UI を使用して実現できます。

次のセクションでは、拡張イベント セッションを作成し、レポート データを表示する UI の手順について確認できます。 この記事の手順を実際に実行するか、確認したら、手順に関連する概念を読んで理解を深めることができます。

SSMS のイベント セッションの作成

拡張イベント セッションを作成するときに、システムを以下のことを指示します。

  • 関心のあるイベント。
  • システムにデータを報告させる方法

デモでは、[新しいセッション] ダイアログが開き、次の名前の 4 つのページを使用する方法が示されます。

  • 全般
  • Events
  • データ ストレージ
  • 上級

テキストとサポートされているスクリーンショットは、SSMS のバージョンで若干異なる場合がありますが、基本的な概念の説明に関連する必要があります。

  1. データベース エンジンのインスタンスへ接続します。 拡張イベントは、SQL Server 2014(12.x)以降、Azure SQL Database、および Azure SQL Managed Instance でサポートされています。

  2. オブジェクト エクスプローラー、管理、> 拡張イベント。 Azure SQL Database では、イベント セッションはデータベース スコープであるため、拡張イベント オプションは管理ではなく、各データベースの下にあります。

  3. Sessions フォルダーを右クリックし、New Session... を選択します。New Session... ダイアログは、新しいセッション ウィザードすることをお勧めしますが、この 2 つは似ています。

    ヒント

    これらのチュートリアルの手順では、GeneralEventsData StorageAdvanced の 4 つのページをすべて進めるまで、OK にヒットしないでください。

  4. 全般ページを選択します。 次に、[セッション名]テキストボックスにセッション名に YourSession または任意の名前を入力します。 他のページに詳細を入力する必要があるため、[OK] をまだ選択しないでください。

  5. イベントページを選択します。

  6. [イベント ライブラリ] の領域で、ドロップダウン リストから [イベント名のみ] を選択します。

    • テキスト ボックスに sql_statement と入力します。 これにより、リストがフィルター処理され、sql_statement 名前に含まれる イベントのみが表示されます。
    • スクロールして、sql_statement_completed という名前のイベントを選択します。
    • 右矢印ボタン > をクリックして、イベントを [選択したイベント] ボックスに移動します。
  7. [イベント] ページで、[構成] ボタンをクリックします。 選択したイベントの [イベント構成オプション ] ボックスが開きます。

    [新しいセッション > イベント] > [イベントから選択] library. sql_statement_completed が選択されているスクリーンショット。[構成] ボタンは次のアクションです。

  8. Filter (Predicate) タブを選択します。次に、句を追加するには、ここで Click という新しいフィルター行を選択。 このチュートリアルでは、このフィルター (述語とも呼ばれます) を構成して、すべての SELECT ステートメントを HAVING 句でキャプチャします。

  9. [フィールド] ドロップダウン リストで、sqlserver.sql_text を選択します。

    • [演算子]の場合は、like_i_sql_unicode_string を選択します。 ここで、i 演算子の名前は case-i nsensitive を意味します。
    • [値]%SELECT%HAVING% と入力します。 ここでは、パーセント記号 (%) は、任意の文字列に対して存在するワイルドカードです。

    Note

    この 2 部構成の名前では、sqlserver がパッケージ名で、sql_text がフィールド名です。 前の手順で選択したイベント sql_statement_completed は、選択したフィールドと同じパッケージ内にある必要があります。

    [新しいセッション] > [イベント] > [構成] > [フィルター (述語)] > [フィールド]のスクリーンショット

  10. [データストレージ] ページを選択します。

  11. Targets領域で、ターゲットを追加するには、ここでクリックという新しいターゲットの種類の行を選択します。 このチュートリアルでは、キャプチャした拡張イベント データをイベント ファイルに書き込みます。 これは、イベント データが後で開いたり表示できるファイルに格納されることを意味します。 SQL Server 2019 (15.x) 以降では、Azure SQL の既定値である Azure Storage に格納されるようにイベント データを書き込むこともできます。

    • [種類] ドロップダウン リストで、event_file を選択します。
  12. [プロパティ] 領域で、 [サーバー上のファイル名] テキスト ボックスに完全パスとファイル名を入力します。 また、スタート メニューの[参照]ボタンを使用できます。 ファイル名の拡張子は xel にする必要があります。 この例では、 C:\temp\YourSession_Target.xelを使用しました。

    [新しいセッション] > [データ ストレージ] > [ターゲット] > [種類] > [event_file]のスクリーンショット

  13. [詳細] ページを選択します。 既定の構成では、拡張イベント セッションのこの .xel ターゲットは、サーバーのパフォーマンスに対する影響を最小限に抑えるかまったく行いませんが、 Advanced ページのこれらの設定を使用して、リソースと待機時間を増減できます。

    [新しいセッション] > [詳細設定] のスクリーンショット。

  14. 下部にある [OK] ボタンを選択して、このイベント セッションを作成します。

  15. SSMS オブジェクト エクスプローラーに戻り、Sessions フォルダーを開くか更新し、YourSession拡張イベント セッションの新しいノードを確認します。 セッションはまだ開始されていません。 このチュートリアルでは、後で開始します。

SSMS でイベント セッションを編集します

SSMS オブジェクト エクスプローラーでイベント セッションを編集するには、そのノードを右クリックして、 [プロパティ]を選択します。 同じマルチページのダイアログが表示されます。

T-SQL を使用してイベント セッションを作成します

SSMS では、次のように T-SQL スクリプトを生成してイベント セッションを作成できます。

  • イベント セッション ノードを右クリックし、[> Create to > Clipboard]としてスクリプト セッション を選択します。
  • 任意のテキスト エディターに貼り付けます。

生成される CREATE EVENT SESSIONYourSession の T-SQL ステートメントを次に示します。

CREATE EVENT SESSION [YourSession]
    ON SERVER -- For SQL Server and Azure SQL Managed Instance
    -- ON DATABASE -- For Azure SQL Database
    ADD EVENT sqlserver.sql_statement_completed
    (
        ACTION(sqlserver.sql_text)
        WHERE
        ( [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%SELECT%HAVING%')
        )
    )
    ADD TARGET package0.event_file 
    (SET filename=N'C:\temp\YourSession_Target.xel');
GO

Note

Azure SQL Database では、ON SERVERの代わりにON DATABASEを使用します。

イベント セッションの条件付き DROP

CREATE EVENT SESSION ステートメントの前に、同じ名前の DROP EVENT SESSION セッションが既に存在する場合に備えて、ステートメントを条件付きで実行できます。 これにより、既存のセッションが削除されます。 これを行わないと、同じ名前のセッションを作成しようとすると、エラーが発生します。

IF EXISTS (SELECT *
      FROM sys.server_event_sessions
      WHERE name = 'YourSession')
BEGIN
    DROP EVENT SESSION YourSession
          ON SERVER;
END
GO

T-SQL を使用してイベント セッションを開始および停止します

イベント セッションを作成する際の既定は、自動的に実行を開始しないです。 次の ALTER EVENT SESSION T-SQLステートメントを使用して、いつでもイベント セッションを開始または停止することができます。

ALTER EVENT SESSION [YourSession]
      ON SERVER
    STATE = START; -- STOP;

データベース エンジン インスタンスの開始時に、自動的に開始するようにイベント セッションに指示することもできます。 CREATE EVENT SESSIONSTARTUP STATE = ON キーワード を参照してください。

SSMS UI には、対応するチェックボックスが用意されています。[新しいセッション] > [全般] ページで、サーバーの起動時にイベント セッションを開始します

イベント セッションをテストします

次の手順を使って、イベント セッションをテストします。

  1. SSMS オブジェクト エクスプローラーで、イベント セッション ノードを右クリックし、 [セッションの開始]をクリックします。
  2. イベント セッションを作成したのと同じサーバー (または Azure SQL Database 内の同じデータベース) に接続しているときに、次 の SELECT...HAVING ステートメントを数回実行します。 実行ごとに HAVING 句の値を変更し、2 から 3 の間で切り替えます。 これにより結果の違いを確認することができます。
  3. セッション ノードを右クリックして、 [セッションの停止]を選択kします。
  4. 次のサブセクションで、 SELECT を使用して結果を表示する方法についてお読みください。
SELECT c.name,
    COUNT(*) AS [Count-Per-Column-Repeated-Name]
FROM sys.syscolumns AS c
INNER JOIN sys.sysobjects AS o
    ON o.id = c.id
WHERE o.type = 'V'
    AND c.name LIKE '%event%'
GROUP BY c.name
HAVING Count(*) >= 3 --2     -- Try both values during session.
ORDER BY c.name;

完全性を保つために、次のは、前述 SELECT...HAVING の例の出力です。

/* Approximate output, 6 rows, all HAVING Count >= 3:
name                   Count-Per-Column-Repeated-Name
---------------------  ------------------------------
event_group_type       4
event_group_type_desc  4
event_session_address  5
event_session_id       5
is_trigger_event       4
trace_event_id         3
*/

XML としてのイベント セッション データの表示

SSMS のクエリ ウィンドウで、次の SELECT ステートメントを実行して、セッションによってキャプチャされたイベント データを確認します。 各行は、1 回のイベント発生を表します。 CAST(... AS xml) は列のデータ型がnvarchar から xmlに変更されます。 これにより、列の値を選択して、読みやすくするために新しいウィンドウで列の値を開くことができます。

Note

event_file ターゲットは常に、xel ファイル名に数値部分を挿入します。 次のクエリを実行する前に、この数値部分を含む xel ファイルの実際の完全な名前をコピーし、SELECT ステートメントに 貼り付ける必要があります。 次の例では、数値部分は _0_131085363367310000 です。

SELECT object_name,
    file_name,
    file_offset,
    event_data,
    'CLICK_NEXT_CELL_TO_BROWSE_XML RESULTS!' AS [CLICK_NEXT_CELL_TO_BROWSE_XML_RESULTS],
    CAST(event_data AS XML) AS [event_data_XML]
-- TODO: In the SSMS results grid, click this XML cell
FROM sys.fn_xe_file_target_read_file(
    'C:\Temp\YourSession_Target_0_131085363367310000.xel', NULL, NULL, NULL
);

このクエリには、特定のイベント行の完全な結果を表示する 2 つの方法が用意されています。

  • SSMS で SELECT を実行し、event_data_XML 列内のセルを選択します。

  • event_data 列内のセルから長い XML 文字列をコピーします。 文字列を Notepad ようなテキスト エディターに貼り付けて、ファイルを xml 拡張子で保存します。 次に、XML データを表示できるブラウザーまたはエディターでファイルを開きます。

XML のイベント データ

次に、XML 形式で結果の一部を確認します。 以下の XML は簡潔にするために編集されています。 <data name="row_count">6 の値を表示します。これは、上記で表示した 6 つの結果の行に一致します。 SELECT ステートメント全体を表示できます。

<event name="sql_statement_completed" package="sqlserver" timestamp="2016-05-24T04:06:08.997Z">
  <data name="duration">
    <value>111021</value>
  </data>
  <data name="cpu_time">
    <value>109000</value>
  </data>
  <data name="physical_reads">
    <value>0</value>
  </data>
  <data name="last_row_count">
    <value>6</value>
  </data>
  <data name="offset">
    <value>0</value>
  </data>
  <data name="offset_end">
    <value>584</value>
  </data>
  <data name="statement">
    <value>SELECT c.name,
            COUNT(*) AS [Count-Per-Column-Repeated-Name]
        FROM sys.syscolumns AS c
        INNER JOIN sys.sysobjects AS o
            ON o.id = c.id
        WHERE o.type = 'V'
            AND c.name LIKE '%event%'
        GROUP BY c.name
        HAVING Count(*) >= 3 --2     -- Try both values during session.
    ORDER BY c.name;</value>
      </data>
</event>

SSMS でイベント セッション データを表示します

イベントセッションからキャプチャされたデータを表示ために使用できる SSMS UI には、いくつかの高度な機能があります。 詳細については、「SQL Server Management Studio でイベント データを表示する」を参照してください。

[ターゲット データの表示] と [ライブ データの監視]のラベルが付いた、ショートカット メニュー オプションで始めます。

ターゲット データの表示

SSMS オブジェクト エクスプローラーでは、イベント セッション ノードの下にあるターゲット ノード (たとえば、package0.event_counter) を右クリックできます。 コンテキスト メニューで [ターゲット データの表示]をクリックします。 SSMS でデータが表示されます。

セッションで新しいイベントが発生すると、表示は更新されません。 しかし、 [ターゲット データの表示] をもう一度選択できます。

ライブ データの監視

SSMS オブジェクト エクスプローラーで、イベント セッション ノードを右クリックします。 コンテキスト メニューで [ライブ データの監視]を選択します。 SSMS では、受信データがリアルタイムで引き続き到着するため、受信データが表示されます。

拡張イベントの用語と概念

次の表は、拡張イベントで使用される用語とその意味を示しています。

Term 説明
event session 1 つ以上のイベントを中心にしたコンストラクトと、アクションなどのサポート アイテムがターゲットです。 この CREATE EVENT SESSION ステートメントは、各イベント セッションを作成します。 ALTER をしてイベント セッションを任意に開始、停止できます。

イベント セッションは、文脈から イベント セッションを指していることが明らかな場合には、単に セッションと呼ばれることがあります。
イベント セッションの詳細は、「拡張イベント セッション」で説明しています。
event アクティブなイベント セッションによって監視されるシステムでの内の特定の事象です。

たとえば、sql_statement_completed イベントは、指定された T-SQL ステートメントが完了した時点を表します。 イベントは、その継続時間とその他のデータを報告できます。
target キャプチャしたイベントからの出力データを受信するアイテムです。 ターゲットはデータを表示します。

たとえば、 event_file このクイック スタートで前に使用したターゲットや、最新のイベントを ring_buffer メモリに保持するターゲットなどがあります。
どの種類のターゲットも任意のイベント セッションに使用できます。 詳細については、「拡張イベントのターゲット」を参照してください。
action イベントにとって既知のフィールドです。 フィールドのデータは、ターゲットに送信されます。 アクション フィールドは 述語フィルターに密接に関係しています。
predicate、またはフィルター イベント発生の興味のあるサブセットのみがターゲットに送信されるように使用される、イベント フィールド内のデータのテストです。

たとえば、T-SQLステートメントに文字列 sql_statement_completed が含まれている ‭HAVING‬ イベント発生のみを含むようにフィルターを指定できます。
package イベントのコアを軸として展開するアイテム セット内の各アイテムにアタッチされている名前修飾子です。

たとえば、パッケージには、T-SQL テキストに関するイベントを含めることができます。 1 つのイベントが、バッチ内のすべての T-SQL に関係する場合があります。 一方、個別の T-SQL ステートメントに関する別のより狭義のイベントもあります。 さらに、どの T-SQL ステートメントにも、started イベントと completed イベントがあります。
イベントに適したフィールドも、イベントとともにパッケージされています。 ほとんどのターゲットが package0 内にあり、その他の多くのパッケージからのイベントとともに使用されます。

拡張イベントのシナリオと使用状況の詳細

拡張イベントを使用してデータベース エンジンとクエリ ワークロードを監視およびトラブルシューティングするシナリオは多数あります。 次の記事では、ロック関連のシナリオの使用例を示します。

パッケージ内で使用可能なイベントを見つける方法

次のクエリは、名前に sql の 3 文字を含む使用可能な各イベントの行を返します。 LIKE 句を編集して、さまざまなイベント名を検索できます。 結果セットは、イベントを含むパッケージも識別します。

SELECT -- Find an event you want.
    p.name AS [Package-Name],
    o.object_type,
    o.name AS [Object-Name],
    o.description AS [Object-Descr],
    p.guid AS [Package-Guid]
FROM sys.dm_xe_packages AS p
INNER JOIN sys.dm_xe_objects AS o
    ON p.guid = o.package_guid
WHERE o.object_type = 'event' --'action'  --'target'
    AND p.name LIKE '%'
    AND o.name LIKE '%sql%'
ORDER BY p.name,
    o.object_type,
    o.name;

次の結果の例は、返された行を示しています。ここでは、次の column name = value 形式にピボットされています。 データは、前の手順の例で使用された sql_statement_completed イベントからのものです。 オブジェクトの説明 (この例ではイベント) は、ドキュメント文字列として機能します。

Package-Name = sqlserver
object_type  = event
Object-Name  = sql_statement_completed
Object-Descr = Occurs when a Transact-SQL statement has completed.
Package-Guid = 655FD93F-3364-40D5-B2BA-330F7FFB6491

SSMS UI を使用してイベントを検索する

イベント名を検索するもう 1 つの方法は、前のスクリーンショットに示されている [新しいセッション > イベント > イベント ライブラリ] ダイアログを使用することです。 部分的なイベント名を入力し、一致するすべてのイベント名を検索できます。

SQL トレース イベント クラス。

SQLトレースイベントクラスと列を使用した拡張イベントの使用に関する説明は、次のリンクにあります:「拡張イベントとSQLトレースイベントクラスの対応関係を表示」。

Event Tracing for Windows (ETW)

拡張イベントと Windows イベント トレーシング (ETW) の使用に関する説明は、以下をご覧ください。

システム イベント セッション

SQL Server と Azure SQL Managed Instance では、既定で複数のシステム イベント セッションが作成され、データベース エンジンの起動時に開始するように構成されます。 ほとんどのイベント セッションと同様に、少量のリソースを消費し、ワークロードのパフォーマンスに大きな影響を与えることはありません。 Microsoft では、これらのセッションを再度有効メイン実行することをお勧めします。 正常性セッション (特に system_health セッション) は、多くの場合、監視とトラブルシューティングに役立ちます。

これらのイベント セッションは、[管理 > 拡張イベント > セッション]の下の SSMS オブジェクト エクスプローラーで確認できます。 たとえば、SQL Server では、次のシステム イベント セッションがあります。

  • AlwaysOn_health
  • system_health
  • telemetry_events

PowerShell プロバイダー。

SQL Server PowerShell プロバイダーを使用して、拡張イベントを管理することができます。 詳細については、「 拡張イベントへの PowerShell プロバイダーの使用」を参照してください。

システム ビュー

拡張イベントのシステム ビューには次のものが含まれます。

  • カタログ ビュー: CREATE EVENT SESSION によって定義されているイベント セッションに関する情報を表示します。
  • 動的管理ビュー (DMV):アクティブな(開始された)イベントセッションに関する情報。

SQL Server の拡張イベントに対するシステム ビューからの SELECT と JOIN - 次に関する情報を提供します。

  • ビューを結合する方法
  • これらのビューに基づくいくつかの便利なクエリ
  • 次の間の相関関係
    • ビュー列
    • CREATE EVENT SESSION
    • The SSMS UI

付録: 拡張イベント権限所有者を検索するクエリ

この記事で言及されているアクセス許可は次のとおりです。

  • ALTER ANY EVENT SESSION
  • VIEW SERVER STATE
  • CONTROL SERVER

次の SELECT...UNION ALL ステートメントは、イベント セッションの作成および拡張イベントのシステム カタログ ビューを照会するために必要な権限を持つユーザーを示す行を返します。

-- Ascertain who has the permissions listed in the ON clause.
-- 'CONTROL SERVER' permission includes all lower permissions like
-- 'ALTER ANY EVENT SESSION' and 'VIEW SERVER STATE'.
SELECT 'Owner-is-Principal' AS [Type-That-Owns-Permission],
    NULL AS [Role-Name],
    prin.name AS [Owner-Name],
    PERM.permission_name COLLATE Latin1_General_CI_AS_KS_WS AS [Permission-Name]
FROM sys.server_permissions AS PERM
INNER JOIN sys.server_principals AS prin
    ON prin.principal_id = PERM.grantee_principal_id
WHERE PERM.permission_name IN (
    'CREATE ANY EVENT SESSION',
    'ALTER ANY EVENT SESSION',
    'VIEW SERVER PERFORMANCE STATE',
    'VIEW SERVER STATE',
    'CONTROL SERVER'
)
UNION ALL
-- Plus check for members of the 'sysadmin' fixed server role,
-- because 'sysadmin' includes the 'CONTROL SERVER' permission.
SELECT 'Owner-is-Role',
    prin.name, -- [Role-Name]
    CAST((IsNull(pri2.name, N'No members')) AS NVARCHAR(128)),
    NULL
FROM sys.server_role_members AS rolm
RIGHT JOIN sys.server_principals AS prin
    ON prin.principal_id = rolm.role_principal_id
LEFT JOIN sys.server_principals AS pri2
    ON rolm.member_principal_id = pri2.principal_id
WHERE prin.name = 'sysadmin';

HAS_PERMS_BY_NAME 関数

SELECT のステートメントは、アクセス許可を報告します。 これは組み込み関数 HAS_PERMS_BY_NAMEに依存します。

さらに、他のログインを一時的に権限を持っている場合は、EXECUTE ASステートメントとREVERTステートメントのコメントを解除して、他のログインがALTER ANY EVENT SESSION権限を保持しているかどうかを確認できます。

--EXECUTE AS LOGIN = 'LoginNameHere';
SELECT HAS_PERMS_BY_NAME(NULL, NULL, 'ALTER ANY EVENT SESSION');
--REVERT;