SQL Server에서 확장 이벤트에 대한 대상Targets for Extended Events in SQL Server

이 항목은 다음에 적용됩니다.예SQL Server(2014부터)예Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2014)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

이 문서에서는 SQL Server에서 확장 이벤트에 대한 패키지0 대상을 사용하는 시기와 방법에 대해 설명합니다.This article explains when and how to use the package0 targets for extended events in SQL Server. 각 대상에 대해 현재 문서에서 설명하는 항목은 다음과 같습니다.For each target, the present article explains:

  • 이벤트에서 보내는 데이터를 수집하고 보고할 수 있는 기능Its abilities in gathering and reporting the data sent by events.
  • 매개 변수(쉽게 이해되는 매개 변수는 제외)Its parameters, except where the parameter is self-explanatory.

XQuery 예제XQuery example

ring_buffer 섹션 에는 XML 문자열을 관계형 행 집합에 복사할 수 있는 Transact-SQL의 XQuery 를 사용하는 예제가 포함되어 있습니다.The ring_buffer section includes an example of using XQuery in Transact-SQL to copy a string of XML into a relational rowset.

필수 구성 요소Prerequisites

  • 빠른 시작: SQL Server에서 확장 이벤트에서 설명한 대로 확장 이벤트의 기본 사항에 대해 일반적으로 잘 알고 있어야 합니다.Be generally familiar with the basics of extended events, as described in Quick Start: Extended events in SQL Server.

  • 자주 업데이트되는 유틸리티 SQL Server Management Studio(SSMS.exe)의 최신 버전이 설치되어 있어야 합니다.Have installed a recent version of the frequently updated utility SQL Server Management Studio (SSMS.exe). 자세한 내용은 다음을 참조하세요.For details see:

  • 출력 데이터를 간편하게 볼 수 있도록 SSMS.exe에서 개체 탐색기를 사용하여 이벤트 세션에서 대상 노드를 마우스 오른쪽 단추로 클릭하는 방법을 알고 있어야 합니다.In SSMS.exe, know how to use the Object Explorer to right-click the target node under your event session, for easy viewing of the output data.

    • 이벤트 데이터는 XML 문자열로 캡처됩니다.The event data is captured as an XML string. 하지만 이 문서에서 데이터는 관계형 행으로 표시됩니다.Yet in this article the data is displayed in relational rows. 데이터 확인을 위해 SSMS가 사용되었고 복사되어 이 문서에 붙여 넣었습니다.SSMS was used to view the data, and then was copied and pasted into this article.
    • XML에서 행 집합을 생성하는 데 필요한 다른 T-SQL 기술에 대해서는 ring_buffer 섹션에서 설명합니다.The alternative T-SQL technique for generating rowsets from XML is explained in the ring_buffer section. XQuery도 포함됩니다.It involves XQuery.

매개 변수, 작업 및 필드Parameters, actions, and fields

Transact-SQL에서 CREATE EVENT SESSION 문은 확장 이벤트의 핵심입니다.In Transact-SQL, the CREATE EVENT SESSION statement is central to extended events. 문을 작성하려면 다음 목록과 설명이 필요합니다.To write the statement you often need a list and description of the following:

  • 선택한 이벤트와 연결된 필드.The fields associated with your chosen event.
  • 선택한 대상과 연결된 매개 변수.The parameters associated with your chosen target.

시스템 뷰에서 이러한 목록을 반환하는 SELECT 문은 다음 문서의 C 섹션에서 복사하여 사용할 수 있습니다.SELECT statements which return such lists from system views are available to copy from the following article, in its section C:

실제 CREATE EVENT SESSION 문의 컨텍스트에서 사용되는 매개 변수, 필드 및 작업은 이 링크에서 볼 수 있습니다.You can see parameters, fields, and actions used in the context of an actual CREATE EVENT SESSION statement, at this link.

etw_classic_sync_target 대상etw_classic_sync_target target

SQL Server 확장 이벤트는 ETW(Windows용 이벤트 추적)와 함께 작동하여 시스템 작업을 모니터링할 수 있습니다.SQL Server extended events can inter-operate with Event Tracing for Windows (ETW) to monitor system activity. 참조 항목:For more information, see:

이 ETW 대상은 수신되는 데이터를 동기적으로 처리하는 반면 대부분 대상은 비동기적으로처리합니다.This ETW target processes synchronously the data it receives, whereas most targets process asynchronously.

event_counter 대상event_counter target

event_counter 대상은 단순히 지정된 각 이벤트 발생 횟수를 계산합니다.The event_counter target merely counts how many times each specified event occurs.

대부분의 다른 대상과 달리,Unlike most other targets:

  • event_counter에 매개 변수가 없습니다.The event_counter has no parameters.

  • 대부분의 대상과 달리 event_counter 대상은 수신되는 데이터를 동기적으로 처리합니다.Unlike most targets, the event_counter target processes synchronously the data it receives.

    • event_counter는 처리와 거의 연관되지 않기 때문에 단순 event_counter에 대해 동기 처리가 허용됩니다.Synchronous is acceptable for the simple event_counter because the event_counter involves so little processing.
    • 데이터베이스 엔진은 속도가 너무 느리고 그로 인해 데이터베이스 엔진의 성능을 저하시키는 대상으로부터 연결이 끊어집니다.The database engine will disconnect from any target which is too slow and which thereby threatens to slow the performance of the database engine. 이러한 이유로 대부분의 대상은 비동기적으로처리합니다.This is one reason why most targets process asynchronously.

event_counter에서 캡처된 출력 예제Example output captured by event_counter

package_name   event_name         count
------------   ----------         -----
sqlserver      checkpoint_begin   4

다음은 이전 결과를 발생시킨 CREATE EVENT SESSION입니다.Next is the CREATE EVENT SESSION that led to the previous results. EVENT...WHERE 절에서는 이 테스트에서 카운트가 4로 올라간 후 계산을 멈추기 위해 package0.counter 필드가 사용되었습니다.For this test, on the EVENT...WHERE clause, the package0.counter field was used to cease the counting after the count climbed to 4.

CREATE EVENT SESSION [event_counter_1]
    ON SERVER 
    ADD EVENT sqlserver.checkpoint_begin   -- Test by issuing CHECKPOINT; statements.
    (
        WHERE ([package0].[counter] <= (4))   -- A predicate filter.
    )
    ADD TARGET package0.event_counter
    WITH
    (
        MAX_MEMORY = 4096 KB,
        MAX_DISPATCH_LATENCY = 3 SECONDS
    );

event_file 대상event_file target

event_file 대상은 버퍼에서 디스크 파일로 이벤트 세션 출력을 작성합니다.The event_file target writes event session output from buffer to a disk file:

  • filename= 매개 변수는 ADD TARGET 절에 지정합니다.You specify the filename= parameter on the ADD TARGET clause.

    • .xel 은 파일의 확장명이어야 합니다..xel must be the extension of the file.
  • 선택한 파일 이름은 시스템에서 date-time 기반 긴 정수가 추가되는 접두사로 사용되며, 이어서 .xel 확장이 나타납니다.The file name you choose is used by the system as a prefix to which a date-time based long integer is appended, followed by the .xel extension.

event_file 대상을 사용하는 CREATE EVENT SESSIONCREATE EVENT SESSION with event_file target

다음은 테스트에 사용된 CREATE EVENT SESSION입니다.Next is the CREATE EVENT SESSION that we used to test with. ADD TARGET 절 중 하나는 event_file를 지정합니다.One of the ADD TARGET clauses specifies an event_file.

CREATE EVENT SESSION [locks_acq_rel_eventfile_22]
    ON SERVER 
    ADD EVENT sqlserver.lock_acquired
    (
        SET
            collect_database_name=(1),
            collect_resource_description=(1)

        ACTION (sqlserver.sql_text,sqlserver.transaction_id)

        WHERE
        (
            [database_name]=N'InMemTest2'
            AND
            [object_id]=(370100359)
        )
    ),
    ADD EVENT sqlserver.lock_released
    (
        SET
            collect_database_name=(1),
            collect_resource_description=(1)

        ACTION(sqlserver.sql_text,sqlserver.transaction_id)

        WHERE
        (
            [database_name]=N'InMemTest2'
            AND
            [object_id]=(370100359)
        )
    )
    ADD TARGET package0.event_counter,
    ADD TARGET package0.event_file
    (
        SET     filename=N'C:\Junk\locks_acq_rel_eventfile_22-.xel'
    )
    WITH
    (
        MAX_MEMORY=4096 KB,
        MAX_DISPATCH_LATENCY=10 SECONDS
    );

sys.fn_xe_file_target_read_file 함수sys.fn_xe_file_target_read_file function

event_file 대상은 수신되는 데이터를 사람이 읽을 수 없는 이진 형식으로 저장합니다.The event_file target stores the data it receives in a binary format that is not human readable. Transact-SQL에서는 sys.fn_xe_file_target_read_file 기능에서 선택하여 .xel 파일의 내용을 보고할 수 있습니다.Transact-SQL can report the contents of the .xel file by SELECTing FROM the sys.fn_xe_file_target_read_file function.

SQL Server 2016 이상의 경우 다음 T-SQL SELECT에서 데이터를 보고합니다.For SQL Server 2016 and later, the following T-SQL SELECT reported the data. *.xel 접미사는 다음과 같습니다.The *.xel suffix in the

SELECT f.*
        --,CAST(f.event_data AS XML)  AS [Event-Data-Cast-To-XML]  -- Optional
    FROM
        sys.fn_xe_file_target_read_file(
            'C:\junk\locks_acq_rel_eventfile_22-*.xel',
            null, null, null)  AS f;

SQL Server 2014이상의 경우 다음과 유사한 SELECT에서 데이터를 보고합니다.For SQL Server 2014, a SELECT similar to the following would report the data. SQL Server 2014 이후부터 .xem 파일이 더 이상 사용되지 않습니다.After SQL Server 2014, the .xem files are no longer used.

SELECT f.*
        --,CAST(f.event_data AS XML)  AS [Event-Data-Cast-To-XML]  -- Optional
    FROM
        sys.fn_xe_file_target_read_file(
            'C:\junk\locks_acq_rel_eventfile_22-*.xel',
            'C:\junk\metafile.xem',
            null, null)  AS f;

물론 .xel 데이터를 보려면 SSMS UI를 수동으로 사용할 수도 있습니다.Of course, you can also manually use the SSMS UI to see the .xel data:

event_file 대상에 저장된 데이터Data stored in the event_file target

다음은 SQL Server 2016의 sys.fn_xe_file_target_read_file에서 선택한 보고서입니다.Next is the report from SELECTing from sys.fn_xe_file_target_read_file, in SQL Server 2016.

module_guid                            package_guid                           object_name     event_data                                                                                                                                                                                                                                                                                          file_name                                                      file_offset
-----------                            ------------                           -----------     ----------                                                                                                                                                                                                                                                                                          ---------                                                      -----------
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   lock_acquired   <event name="lock_acquired" package="sqlserver" timestamp="2016-08-07T20:13:35.827Z"><action name="transaction_id" package="sqlserver"><value>39194</value></action><action name="sql_text" package="sqlserver"><value><![CDATA[  select top 1 * from dbo.T_Target;  ]]></value></action></event>   C:\junk\locks_acq_rel_eventfile_22-_0_131150744126230000.xel   11776
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   lock_released   <event name="lock_released" package="sqlserver" timestamp="2016-08-07T20:13:35.832Z"><action name="transaction_id" package="sqlserver"><value>39194</value></action><action name="sql_text" package="sqlserver"><value><![CDATA[  select top 1 * from dbo.T_Target;  ]]></value></action></event>   C:\junk\locks_acq_rel_eventfile_22-_0_131150744126230000.xel   11776

히스토그램 대상histogram target

히스토그램 대상은 event_counter 대상을 보다 더 세분화됩니다.The histogram target is fancier than the event_counter target. 히스토그램에서는 다음을 수행할 수 있습니다.The histogram can do the following:

  • 여러 항목에 대한 발생을 개별적으로 계산합니다.Count occurrences for several items separately.
  • 다양한 유형의 항목 발생을 계산합니다.Count occurrences of different types of items:
    • 이벤트 필드.Event fields.
    • 동작.Actions.

source_type 매개 변수는 히스토그램 대상을 조정하는 중요 항목입니다.The source_type parameter is the key to controlling the histogram target:

  • source_type = 0 - 이벤트 필드에 대한 데이터 수집을 의미합니다.source_type=0 - Means collect data for event fields).
  • source_type = 1 - 작업에 대한 데이터 수집을 의미합니다.source_type=1 - Means collect data for actions.
    • 1은 기본값입니다.1 is the default.

'slots' 매개 변수 기본값은 256입니다.The 'slots' parameter default is 256. 다른 값을 할당하면 값이 2의 거듭 제곱으로 반올림됩니다.If you assign another value, the value is rounded up to the next power of 2.

  • 예를 들어 slots= 59이면 반올림되어 최대 64가 됩니다.For example, slots=59 would be rounded up to =64.

히스토그램에 대한작업 예제Action example for histogram

TARGET...SET 절에서 다음 Transact-SQL CREATE EVENT SESSION 문은 source_type = 1의 대상 매개 변수 할당을 지정합니다.On its TARGET...SET clause, the following Transact-SQL CREATE EVENT SESSION statement specifies the target parameter assignment of source_type=1. 1은 히스토그램 대상에서 작업을 추적했음을 의미합니다.The 1 means the histogram target tracks an action.

현재 예에서 EVENT...ACTION 절이 제공되면 선택하는 대상( sqlos.system_thread_id)에 대한 작업 하나만 제공됩니다.In the present example, the EVENT...ACTION clause offer happens to offer only one action for the target to choose, namely sqlos.system_thread_id. TARGET...SET 절에는 source=N'sqlos.system_thread_id' 할당이 표시됩니다.On the TARGET...SET clause, we see the assignment source=N'sqlos.system_thread_id' assignment.

  • 원본 작업을 하나 이상 추적할 수 있도록 CREATE EVENT SESSION 문에 두 번째 히스토그램 대상을 추가할 수 있습니다.To track more than one source action, you can add a second histogram target to your CREATE EVENT SESSION statement.
CREATE EVENT SESSION [histogram_lockacquired]
    ON SERVER 
    ADD EVENT sqlserver.lock_acquired
        (
        ACTION
            (
            sqlos.system_thread_id
            )
        )
    ADD TARGET package0.histogram
        (
        SET
            filtering_event_name=N'sqlserver.lock_acquired',
            slots=(16),
            source=N'sqlos.system_thread_id',
            source_type=1
        )
    WITH
        (
        <.... (For brevity, numerous parameter assignments generated by SSMS.exe are not shown here.) ....>
        );

다음 데이터는 캡처되었습니다.The following data was captured. 열 아래의 값은 system_thread_id 값입니다.The values under the value column were system_thread_id values. 예를 들어 총 236 잠금 수는 스레드 6540에서 가져왔습니다.For instance, a total of 236 locks were taken under thread 6540.

value   count
-----   -----
 6540     236
 9308      91
 9668      74
10144      49
 5244      44
 2396      28

사용 가능한 작업을 검색하는 SELECTSELECT to discover available actions

C.3 SELECT 문에서는 CREATE EVENT SESSION 문에서 지정하는 데 시스템에서 사용할 수 있는 작업을 찾을 수 있습니다.The C.3 SELECT statement can find the actions that the system has available for you to specify on your CREATE EVENT SESSION statement. WHERE 절에서 먼저 o.name LIKE 필터를 관심 있는 작업과 일치하도록 편집합니다.In the WHERE clause, you would first edit the o.name LIKE filter to match the actions that interest you.

다음은 C.3 SELECT에서 반환된 샘플 행 집합입니다.Next is a sample rowset returned by the C.3 SELECT. system_thread_id 작업은 두 번째 행에 표시됩니다.The system_thread_id action is seen in the second row.

Package-Name   Action-Name                 Action-Description
------------   -----------                 ------------------
package0       collect_current_thread_id   Collect the current Windows thread ID
sqlos          system_thread_id            Collect current system thread ID
sqlserver      create_dump_all_threads     Create mini dump including all threads
sqlserver      create_dump_single_thread   Create mini dump for the current thread

히스토그램에 대한 이벤트 필드 예제Event field example for histogram

다음 예제에서는 source_type = 0을 설정합니다.The following example sets source_type=0. source= 에 할당된 값은 이벤트 필드(작업 아님)입니다.The value assigned to source= is an event field (not an action).

CREATE EVENT SESSION [histogram_checkpoint_dbid]
    ON SERVER 
    ADD EVENT  sqlserver.checkpoint_begin
    ADD TARGET package0.histogram
    (
    SET
        filtering_event_name = N'sqlserver.checkpoint_begin',
        source               = N'database_id',
        source_type          = (0)
    )
    WITH
    ( <....> );

다음 데이터는 히스토그램 대상에서 캡처한 것입니다.The following data was captured by the histogram target. 데이터는 ID = 5 숙련됨 7 checkpoint_begin 이벤트인 데이터베이스를 보여 줍니다.The data shows that the database that is ID=5 experienced 7 checkpoint_begin events.

value   count
-----   -----
5       7
7       4
6       3

선택한 이벤트에 사용 가능한 필드를 검색하는 SELECTSELECT to discover available fields on your chosen event

C.4 SELECT 문은 선택할 수 있는 이벤트 필드를 보여 줍니다.The C.4 SELECT statement shows event fields that you can choose from. 먼저 o.name LIKE 필터를 선택한 이벤트 이름으로 편집합니다.You would first edit the o.name LIKE filter to be your chosen event name.

다음은 C.4 SELECT에서 반환된 행 집합니다.The following rowset was returned by the C.4 SELECT. 행 집합에서는 database_id가 히스토그램 대상에 대한 값을 제공할 수 있는 checkpoint_begin 이벤트의 유일한 필드임을 보여 줍니다.The rowset shows that database_id is the only one field on the checkpoint_begin event that can supply values for the histogram target.

Package-Name   Event-Name         Field-Name   Field-Description
------------   ----------         ----------   -----------------
sqlserver      checkpoint_begin   database_id  NULL
sqlserver      checkpoint_end     database_id  NULL

pair_matching 대상pair_matching target

pair_matching 대상에서는 해당 종료 이벤트없이 발생하는 시작 이벤트를 검색할 수 있습니다.The pair_matching target enables you to detect start events that occurs without a corresponding end event. 예를 들어, lock_acquired 이벤트가 발생하지만 이와 일치하는 lock_released 이벤트가 그다음에 적절히 수행되지 않으면 문제일 수 있습니다.For instance, it might be a problem when a lock_acquired event occurs but no matching lock_released event follows in a timely manner.

시스템은 자동으로 시작 및 종료 이벤트를 일치시키지 않습니다.The system does not automatically match start and end events. 대신 CREATE EVENT SESSION 문에서 시스템 일치에 대해 설명합니다.Instead, you explain the matching to the system in your CREATE EVENT SESSION statement. 시작 및 종료 이벤트가 일치하면 일치 하지 않는 시작 이벤트에 집중할 수 있도록 해당 쌍은 삭제됩니다.When a start and end event are matched, the pair is discarded so everyone can focus on the unmatched start events.

시작 및 종료 이벤트 쌍에 대해 일치 가능한 필드 찾기Finding matchable fields for the start and end event pair

C.4 SELECT를 사용하여 lock_acquired 이벤트에 대한 약 16개 필드가 다음 행 집합으로 표시합니다.By using the C.4 SELECT, we see in the following rowset there are about 16 fields for the lock_acquired event. 여기에 표시되는 행 집합은 예제에서 일치시킨 필드를 보여주도록 수동으로 분리되었습니다.The rowset displayed here has been manually split to show which fields our example matched on. 일부 필드는 두 이벤트의 기간 의 경우와 같이 의미없이 일치를 시도했습니다.Some fields would be silly to try matching, such as on the duration of both events.

Package-Name   Event-Name   Field-Name               Field-Description
------------   ----------   ----------               -----------------
sqlserver   lock_acquired   database_name            NULL
sqlserver   lock_acquired   mode                     NULL
sqlserver   lock_acquired   resource_0               The ID of the locked object, when lock_resource_type is OBJECT.
sqlserver   lock_acquired   resource_1               NULL
sqlserver   lock_acquired   resource_2               The ID of the lock partition, when lock_resource_type is OBJECT, and resource_1 is 0.
sqlserver   lock_acquired   transaction_id           NULL

sqlserver   lock_acquired   associated_object_id     The ID of the object that requested the lock that was acquired.
sqlserver   lock_acquired   database_id              NULL
sqlserver   lock_acquired   duration                 The time (in microseconds) between when the lock was requested and when it was canceled.
sqlserver   lock_acquired   lockspace_nest_id        NULL
sqlserver   lock_acquired   lockspace_sub_id         NULL
sqlserver   lock_acquired   lockspace_workspace_id   NULL
sqlserver   lock_acquired   object_id                The ID of the locked object, when lock_resource_type is OBJECT. For other lock resource types it will be 0
sqlserver   lock_acquired   owner_type               NULL
sqlserver   lock_acquired   resource_description     The description of the lock resource. The description depends on the type of lock. This is the same value as the resource_description column in the sys.dm_tran_locks view.
sqlserver   lock_acquired   resource_type            NULL

pair_matching 예Example of pair_matching

다음 CREATE EVENT SESSION 문을 두 이벤트와 두 대상을 지정합니다.The following CREATE EVENT SESSION statement specifies two events, and two targets. pair_matching 대상에서는 이벤트가 일치하는 두 필드 집합을 쌍으로 지정합니다.The pair_matching target specifies two sets of fields to match the events into pairs. begin_matching_columns=end_matching_columns= 에 할당된 쉼표로 구분된 필드 순서는 동일해야 합니다.The sequence of comma-delimited fields assigned to begin_matching_columns= and end_matching_columns= must be the same. 쉼표로 구분된 값에서 언급된 필드 사이에는 탭이나 줄 바꿈이 허용되지 않습니다. 공백은 허용됩니다.No tabs or newlines are allowed between the fields mentioned in the comma-delimited value, although spaces are okay.

결과 범위를 좁히기 위해 먼저 테스트 테이블의 object_id를 찾을 수 있도록 sys.objects에서 선택했습니다.To narrow the results, we first SELECTed from sys.objects to find the object_id of our test table. EVENT...WHERE 절에 해당하는 ID 하나에 대한 필터를 추가했습니다.We added a filter for that one ID to the EVENT...WHERE clause.

CREATE EVENT SESSION [pair_matching_lock_a_r_33]
    ON SERVER 
    ADD EVENT sqlserver.lock_acquired
    (
        SET
            collect_database_name = (1),
            collect_resource_description = (1)

        ACTION (sqlserver.transaction_id)

        WHERE
        (
            [database_name] = 'InMemTest2'
            AND
            [object_id] = 370100359
        )
    ),
    ADD EVENT sqlserver.lock_released
    (
        SET
            collect_database_name = (1),
            collect_resource_description = (1)

        ACTION (sqlserver.transaction_id)

        WHERE
        (
            [database_name] = 'InMemTest2'
            AND
            [object_id] = 370100359
        )
    )
    ADD TARGET package0.event_counter,
    ADD TARGET package0.pair_matching
    (
        SET
            begin_event = N'sqlserver.lock_acquired',
            begin_matching_columns =
                N'resource_0, resource_1, resource_2, transaction_id, database_id',

            end_event = N'sqlserver.lock_released',
            end_matching_columns =
                N'resource_0, resource_1, resource_2, transaction_id, database_id',

            respond_to_memory_pressure = (1)
    )
    WITH
    (
        MAX_MEMORY = 8192 KB,
        MAX_DISPATCH_LATENCY = 15 SECONDS
    );

이벤트 세션을 테스트하기 위해 취득한 잠금이 해제되지 않도록 설정했습니다.To test the event session, we purposely prevented to acquired locks from being released. 다음 T-SQL 단계에서 수행한 작업입니다.We did this with the following T-SQL steps:

  1. BEGIN TRANSACTION.BEGIN TRANSACTION.
  2. UPDATE MyTable....UPDATE MyTable....
  3. 대상을 검사할 때까지 일부러 COMMIT TRANSACTION을 실행하지 않습니다.Purposely not issue a COMMIT TRANSACTION, until after we examined the targets.
  4. 테스트한 후 나중에 COMMIT TRANSACTION을 실행했습니다.Later after testing, we issued a COMMIT TRANSACTION.

단순 event_counter 대상은 다음 출력 행을 제공합니다.The simple event_counter target provided the following output rows. 52-50=2이므로, 출력을 통해 pair-matching 대상에서 출력을 검사할 때 2개의 쌍을 이루지 않는 lock_acquired 이벤트가 있음을 알려 줍니다.Because 52-50=2, the output tells us we should see 2 unpaired lock_acquired events when we examine the output from the pair-matching target.

package_name   event_name      count
------------   ----------      -----
sqlserver      lock_acquired   52
sqlserver      lock_released   50

pair_matching 대상은 다음과 같은 출력을 제공합니다.The pair_matching target provided the following output. event_counter 출력에서 제안된 것처럼 2개의 lock_acquired 행이 실제로 확인됩니다.As suggested by the event_counter output, we do indeed see 2 lock_acquired rows. 이 행을 통해 2개의 lock_acquired 이벤트가 쌍을 이루고 있지 않음을 알 수 있습니다.The fact that we see these rows at all means these two lock_acquired events are unpaired.

package_name   event_name      timestamp                     database_name   duration   mode   object_id   owner_type   resource_0   resource_1   resource_2   resource_description   resource_type   transaction_id
------------   ----------      ---------                     -------------   --------   ----   ---------   ----------   ----------   ----------   ----------   --------------------   -------------   --------------
sqlserver      lock_acquired   2016-08-05 12:45:47.9980000   InMemTest2      0          S      370100359   Transaction  370100359    3            0            [INDEX_OPERATION]      OBJECT          34126
sqlserver      lock_acquired   2016-08-05 12:45:47.9980000   InMemTest2      0          IX     370100359   Transaction  370100359    0            0                                   OBJECT          34126

쌍을 이루지 않는 lock_acquired 이벤트에 대한 행에는 잠금이 발생한 T-SQL 텍스트 또는 sqlserver.sql_text이 포함될 수 있습니다.The rows for the unpaired lock_acquired events could include the T-SQL text, or sqlserver.sql_text, that took the locks. 하지만 표시를 블로트하지는 않았습니다.But we did not want to bloat the display.

ring_buffer 대상ring_buffer target

ring_buffer 대상은 빠르고 간단한 이벤트 테스트에 유용합니다.The ring_buffer target is handy for quick and simple event testing. 이벤트 세션을 중지하면 저장된 출력이 삭제됩니다.When you stop the event session, the stored output is discarded.

이 ring_buffer 섹션에서는 XQuery의 Transact-SQL 구현을 사용하여 ring_buffer의 XML 콘텐츠를 보다 읽기 쉬운 관계형 행 집합에 복사하는 방법도 알 수 있습니다.In this ring_buffer section we also show how you can use the Transact-SQL implementation of XQuery to copy the XML contents of the ring_buffer into a more readable relational rowset.

ring_buffer를 사용하는 CREATE EVENT SESSIONCREATE EVENT SESSION with ring_buffer

이 CREATE EVENT SESSION 문에서 특별한 것은 없습니다. ring_buffer 대상이 사용됩니다.There is nothing special about this CREATE EVENT SESSION statement, which uses the ring_buffer target.

CREATE EVENT SESSION [ring_buffer_lock_acquired_4]
    ON SERVER 
    ADD EVENT sqlserver.lock_acquired
    (
        SET collect_resource_description=(1)

        ACTION(sqlserver.database_name)

        WHERE
        (
            [object_id]=(370100359)  -- ID of MyTable
            AND
            sqlserver.database_name='InMemTest2'
        )
    )
    ADD TARGET package0.ring_buffer
    (
        SET max_events_limit=(98)
    )
    WITH
    (
        MAX_MEMORY=4096 KB,
        MAX_DISPATCH_LATENCY=3 SECONDS
    );

ring_buffer에서 lock_acquired에 대해 수신한 XML 출력XML output received for lock_acquired by ring_buffer

SELECT 문에서 검색할 때 콘텐츠는 XML 문자열 형식으로 표시됩니다.When retrieved by a SELECT statement, the content is in the form of a string of XML. 이 테스트의 경우 ring_buffer 대상에서 저장한 XML 문자열은 다음과 같이 나타납니다.The XML string that was stored by the ring_buffer target in our testing, is shown next. 그러나 다음 XML을 간략하게 표현하기 위해 2개의 <event> 요소를 제외하고는 모두 지웠습니다.However, for brevity of the following XML display, all but two <event> elements have been erased. 또한 각 <event>에서 불필요한 <data> 요소도 삭제되었습니다.Further, within each <event>, a handful of extraneous <data> elements have been deleted.

<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="6" eventCount="6" droppedCount="0" memoryUsed="1032">
  <event name="lock_acquired" package="sqlserver" timestamp="2016-08-05T23:59:53.987Z">
    <data name="mode">
      <type name="lock_mode" package="sqlserver"></type>
      <value>1</value>
      <text><![CDATA[SCH_S]]></text>
    </data>
    <data name="transaction_id">
      <type name="int64" package="package0"></type>
      <value>111030</value>
    </data>
    <data name="database_id">
      <type name="uint32" package="package0"></type>
      <value>5</value>
    </data>
    <data name="resource_0">
      <type name="uint32" package="package0"></type>
      <value>370100359</value>
    </data>
    <data name="resource_1">
      <type name="uint32" package="package0"></type>
      <value>0</value>
    </data>
    <data name="resource_2">
      <type name="uint32" package="package0"></type>
      <value>0</value>
    </data>
    <data name="database_name">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[]]></value>
    </data>
    <action name="database_name" package="sqlserver">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[InMemTest2]]></value>
    </action>
  </event>
  <event name="lock_acquired" package="sqlserver" timestamp="2016-08-05T23:59:56.012Z">
    <data name="mode">
      <type name="lock_mode" package="sqlserver"></type>
      <value>1</value>
      <text><![CDATA[SCH_S]]></text>
    </data>
    <data name="transaction_id">
      <type name="int64" package="package0"></type>
      <value>111039</value>
    </data>
    <data name="database_id">
      <type name="uint32" package="package0"></type>
      <value>5</value>
    </data>
    <data name="resource_0">
      <type name="uint32" package="package0"></type>
      <value>370100359</value>
    </data>
    <data name="resource_1">
      <type name="uint32" package="package0"></type>
      <value>0</value>
    </data>
    <data name="resource_2">
      <type name="uint32" package="package0"></type>
      <value>0</value>
    </data>
    <data name="database_name">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[]]></value>
    </data>
    <action name="database_name" package="sqlserver">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[InMemTest2]]></value>
    </action>
  </event>
</RingBufferTarget>

이전 XML을 보려면 이벤트 세션이 활성 상태인 동안 다음 SELECT를 실행할 수 있습니다.To see the preceding XML, you can issue the following SELECT while the event session is active. 시스템 뷰 sys.dm_xe_session_targets에서 현재 XML 데이터가 검색됩니다.The active XML data is retrieved from the system view sys.dm_xe_session_targets.

SELECT
        CAST(LocksAcquired.TargetXml AS XML)  AS RBufXml,
    INTO
        #XmlAsTable
    FROM
        (
        SELECT
                CAST(t.target_data AS XML)  AS TargetXml
            FROM
                     sys.dm_xe_session_targets  AS t
                JOIN sys.dm_xe_sessions         AS s

                    ON s.address = t.event_session_address
            WHERE
                t.target_name = 'ring_buffer'
                AND
                s.name        = 'ring_buffer_lock_acquired_4'
        )
            AS LocksAcquired;


SELECT * FROM #XmlAsTable;

행 집합으로 XML을 표시하는 XQueryXQuery to see the XML as a rowset

이전 XML을 관계형 행 집합으로 보려면 다음 T-SQL을 실행하여 위의 SELECT 문에서 계속 진행합니다.To see the preceding XML as a relational rowset, continue from the preceding SELECT statement by issuing the following T-SQL. 주석 처리된 줄은 각각 XQuery 사용에 대해 설명합니다.The commented lines explain each use of XQuery.

SELECT
         -- (A)
         ObjectLocks.value('(@timestamp)[1]',
            'datetime'     )  AS [OccurredDtTm]

        -- (B)
        ,ObjectLocks.value('(data[@name="mode"]/text)[1]',
            'nvarchar(32)' )  AS [Mode]

        -- (C)
        ,ObjectLocks.value('(data[@name="transaction_id"]/value)[1]',
            'bigint' )  AS [TxnId]

        -- (D)
        ,ObjectLocks.value('(action[@name="database_name" and @package="sqlserver"]/value)[1]',
            'nvarchar(128)')  AS [DatabaseName]
    FROM
        #TableXmlCell
    CROSS APPLY
        -- (E)
        TargetDateAsXml.nodes('/RingBufferTarget/event[@name="lock_acquired"]')  AS T(ObjectLocks);

이전 SELECT의 XQuery 메모XQuery notes from preceding SELECT

(A)(A)

  • 타임스탬프 = 특성 값, <event> 요소에 있음timestamp= attribute's value, on <event> element.
  • '(...)[1]' 구문을 사용하면 반복 당 값이 하나만 반환됩니다. XML 데이터 형식 변수 및 열에서 .value() XQuery 메서드에 대한 필수 제한입니다.The '(...)[1]' construct ensures only 1 value returned per iteration, as is a required limitation of the .value() XQuery method of XML data type variable and columns.

(B)(B)

  • <text> 요소의 내부 값, "mode"와 동일한 특성이 이름인 <data> 요소 내에 있음<text> element's inner value, within a <data> element which has its name= attribute equal to "mode".

(C)(C)

  • <value> 요소의 내부 값, "transaction_id"와 동일한 특성이 이름인 <data> 요소 내에 있음<value> elements inner value, within a <data> element which has its name= attribute equal to "transaction_id".

(D)(D)

  • <event>에 <action>이 포함되어 있음<event> contains <action>.
  • 이름은 "database_name"과 동일한 특성이고, 패키지는 "sqlserver"("package0" 아님)와 동일한 특성인 <action>, <value> 요소의 내부 값을 가져옴.<action> having name= attribute equal to "database_name", and package= attribute equal to "sqlserver" (not "package0"), get the inner value of <value> element.

(E)(E)

  • C.A.C.A. 로 인해 이름이 "lock_acquired"와 동일한 특성인 모든 개별 <event> 요소에 대해 반복 처리가 실행됩니다.causes processing to repeat for every individual <event> element which has its name= attribute equal to "lock_acquired".
  • 이전 FROM 절에서 반환된 XML에 적용됩니다.This applies to the XML returned by the preceding FROM clause.

XQuery SELECT 출력Output from XQuery SELECT

다음은 XQuery가 포함된 이전 T-SQL에서 생성된 행 집합입니다.Next is the rowset generated by the preceding T-SQL which includes XQuery.

OccurredDtTm              Mode    DatabaseName
------------              ----    ------------
2016-08-05 23:59:53.987   SCH_S   InMemTest2
2016-08-05 23:59:56.013   SCH_S   InMemTest2

XEvent.NET 네임스페이스 및 C#XEvent .NET namespaces and C#

Package0에는 대상이 2개이지만 Transact-SQL에서 사용할 수 없습니다.Package0 has two more targets, but they cannot be used in Transact-SQL:

  • compressed_historycompressed_history
  • event_streamevent_stream

T-SQL에서 이러한 두 대상을 사용할 수 없다고 알게 되는 방법 중 한 가지는 열 sys.dm_xe_objects.capabilities 에서 null이 아닌 값에 비트 0x1이 포함되지 않았다는 것입니다.One way we know those two targets cannot be used in T-SQL is that their non-null values in the column sys.dm_xe_objects.capabilities do not include the bit 0x1.

event_stream 대상은 C#과 같은 언어로 작성 된.NET 프로그램에서 사용할 수 있습니다.The event_stream target can be used in .NET programs written in languages like C#. C# 및 다른.NET 개발자들은 .NET Framework 클래스(예: 네임스페이스 Microsoft.SqlServer.XEvents.Linq)를 통해 이벤트 스트림에 액세스할 수 있습니다.C# and other .NET developers can access an event stream through a .NET Framework class, such as in namespace Microsoft.SqlServer.XEvents.Linq.

오류가 발생하는 경우 25726 은 이벤트 스트림이 클라이언트에서 데이터를 사용하는 것보다 빨리 데이터를 채웠음을 의미합니다.If encountered, error 25726 means the event stream filled up with data faster than the client could consume the data. 이로 인해 데이터베이스 엔진은 서버 성능 속도 방지를 위해 이벤트 스트림에서 연결을 끊습니다.This caused the database engine to disconnect from the event stream to avoid slowing the performance of the server.

XEvent 네임스페이스XEvent namespaces