다음을 통해 공유


SQL Server 확장 이벤트에 대한 시스템 뷰의 SELECT 및 JOIN

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance

이 문서에서는 SQL Server 및 Azure SQL Database의 확장 이벤트와 관련된 두 가지 시스템 뷰 집합에 대해 설명합니다. 이 문서에서는 다음을 설명합니다.

  • 다양한 시스템 뷰를 조인(JOIN)하는 방법
  • 시스템 뷰에서 특정 종류의 정보를 선택(SELECT)하는 방법
  • 동일한 이벤트 세션 정보가 다양한 기술적 관점에서 표현되는 방식은 각 관점에 대한 이해를 강화합니다.

대부분의 예제는 SQL Server용으로 작성되었습니다. 그러나 약간의 편집만 하면 SQL Database에서도 실행됩니다.

A. 기본 정보

확장 이벤트에 대한 시스템 뷰 집합에는 두 가지가 있습니다.

카탈로그 뷰:

  • 이러한 뷰는 CREATE EVENT SESSION 또는 이와 동등한 SSMS UI에 의해 만들어진 각 이벤트 세션의 정의에 대한 정보를 저장합니다. 그러나 이러한 보기는 세션이 실행되기 시작했는지 여부에 대해서는 전혀 알지 못합니다.

    • 예를 들어 SSMS 개체 탐색기에 정의된 이벤트 세션이 없는 것으로 표시되는 경우 sys.server_event_session_targets 뷰에서 SELECT하면 0개의 행을 반환합니다.
  • 이름 접두사는 다음과 같습니다.

    • sys.server_event_session*은 SQL Server의 이름 접두사입니다.
    • sys.database_event_session*은 SQL Database의 이름 접두사입니다.

DMV(동적 관리 뷰):

  • 실행 중인 이벤트 세션의 현재 활동에 대한 정보를 저장합니다. 그러나 이러한 DMV에는 세션의 정의에 대한 정보가 거의 없습니다.

    • 모든 이벤트 세션이 현재 중지된 경우에도 서버가 시작하는 활성 메모리에 다양한 패키지가 로드되므로 sys.dm_xe_packages 뷰에서 SELECT를 실행하면 여전히 행이 반환됩니다.
    • 같은 이유로 sys.dm_xe_objects sys.dm_xe_object_columns도 여전히 행을 반환합니다.
  • 확장 이벤트 DMV에 대한 이름 접두사는 다음과 같습니다.

    • sys.dm_xe_*는 SQL Server의 이름 접두사입니다.
    • sys.dm_xe_database_*는 일반적으로 SQL Database의 이름 접두사입니다.

사용 권한:

시스템 뷰에서 SELECT하려면 다음 권한이 필요합니다.

  • VIEW SERVER STATE - Microsoft SQL Server에 있는 경우
  • VIEW DATABASE STATE - Azure SQL 데이터베이스에 있는 경우

B. 카탈로그 뷰

이 섹션에서는 동일한 정의된 이벤트 세션에 대한 서로 다른 세 가지의 기술적 관점을 대조하고 상관 관계를 지정합니다. 세션이 정의되어 SQL Server Management Studio(SSMS.exe)의 개체 탐색기에 표시되지만 세션이 현재 실행되고 있지 않습니다.

예기치 않은 오류를 방지하려면 매달 SSMS의 최신 업데이트를 설치하는 것이 좋습니다.

확장 이벤트의 카탈로그 뷰에 대한 참조 설명서는 확장 이벤트 카탈로그 뷰(Transact-SQL)에 있습니다.

 

이 섹션 B의 순서:

  • B.1 SSMS UI 관점

    • SSMS UI를 사용하여 이벤트 세션의 정의를 만듭니다. 단계별 스크린샷이 나와 있습니다.
  • B.2 Transact-SQL 관점

    • SSMS 상황에 맞는 메뉴를 사용하여 정의된 이벤트 세션을 동등한 Transact-SQL CREATE EVENT SESSION 문으로 리버스 엔지니어링할 수 있습니다. T-SQL은 SSMS 스크린샷 선택 항목과 완벽하게 일치합니다.
  • B.3 카탈로그 뷰 SELECT JOIN UNION 관점

    • 이벤트 세션에 대한 시스템 카탈로그 뷰에서 T-SQL SELECT 문을 실행합니다. 결과는 CREATE EVENT SESSION 문 사양과 일치합니다.

 

B.1 SSMS UI 관점

SSMS의 개체 탐색기에서 관리>확장 이벤트를 확장한 다음, 세션>새 세션을 마우스 오른쪽 단추로 클릭하여 새 세션 대화 상자를 시작할 수 있습니다.

새 세션 대화 상자의 첫 번째 섹션인 일반레이블이 지정된 섹션에서 옵션이 서버 시작 시 이벤트 세션 시작으로 선택된 것을 확인할 수 있습니다.

새 세션 > 일반, 서버 시작 시 이벤트 세션 시작을 선택합니다.

다음으로 이벤트 섹션에서는 lock_deadlock 이벤트가 선택된 것을 볼 수 있습니다. 해당 이벤트에 세 개의 작업이 선택된 것을 볼 수 있습니다. 이는 구성 단추가 클릭되었다는 것을 의미하며, 클릭하면 회색으로 표시됩니다.

새 세션 > 이벤트, 전역 필드(작업)

계속 이벤트>구성 섹션에서 resource_type페이지로 설정된 것을 확인할 수 있습니다. 즉, resource_type 값이 PAGE가 아닌 다른 값인 경우 이벤트 데이터가 이벤트 엔진에서 대상으로 전송되지 않습니다.

데이터베이스 이름 및 카운터에 대한 추가 조건자 필터가 표시됩니다.

새 세션 > 이벤트, 필터 조건자 필드(작업)

다음으로 데이터 스토리지 섹션에서 event_file이 대상으로 선택되었음을 확인할 수 있습니다. 또한 파일 롤오버 사용 옵션이 선택되었습니다.

새 세션 > 데이터 스토리지, eventfile_enablefileroleover

마지막으로 고급 섹션에서 최대 디스패치 대기 시간 값이 4초로 감소했음을 확인할 수 있습니다.

새 세션 > 고급, 최대 디스패치 대기 시간

이것으로 SSMS UI 관점에서의 이벤트 세션 정의가 완료되었습니다.

B.2 Transact-SQL 관점

이벤트 세션 정의가 어떻게 만들어졌는지에 관계없이 SSMS UI에서 완벽하게 일치하는 Transact-SQL 스크립트로 세션을 리버스 엔지니어링할 수 있습니다. 앞의 새 세션 스크린샷을 확인하고 표시되는 사양을 다음에 생성되는 T-SQL CREATE EVENT SESSION 스크립트의 절과 비교할 수 있습니다.

이벤트 세션을 리버스 엔지니어링하려면 개체 탐색기 에서 사용자 세션 노드를 마우스 오른쪽 단추로 클릭한 다음 세션 스크립팅>CREATE>클립보드를 선택합니다.

다음 T-SQL 스크립트는 SSMS로 리버스 엔지니어링하여 생성되었습니다. 그런 다음, 공백만 전략적으로 조작하여 스크립트를 수동으로 꾸몄습니다.

CREATE EVENT SESSION [event_session_test3]
	ON SERVER  -- Or, if on Azure SQL Database, ON DATABASE.

	ADD EVENT sqlserver.lock_deadlock
	(
		SET
			collect_database_name = (1)
		ACTION
		(
			package0  .collect_system_time,
			package0  .event_sequence,
			sqlserver .client_hostname
		)
		WHERE
		(
			[database_name]           = N'InMemTest2'
			AND [package0].[counter] <= (16)
			AND [resource_type]       = (6)
		)
	)

	ADD TARGET package0.event_file
	(
		SET
			filename           = N'C:\Junk\event_session_test3_EF.xel',
			max_file_size      = (20),
			max_rollover_files = (2)
	)

	WITH
	(
		MAX_MEMORY            = 4096 KB,
		EVENT_RETENTION_MODE  = ALLOW_SINGLE_EVENT_LOSS,
		MAX_DISPATCH_LATENCY  = 4 SECONDS,
		MAX_EVENT_SIZE        = 0 KB,
		MEMORY_PARTITION_MODE = NONE,
		TRACK_CAUSALITY       = OFF,
		STARTUP_STATE         = ON
	);

이것으로 T-SQL 관점을 완료했습니다.

B.3 카탈로그 뷰 SELECT JOIN UNION 관점

염려하지 마세요. 다음 T-SQL SELECT 문은 여러 개의 작은 SELECT를 함께 UNION하기 때문에 길이가 깁니다. 작은 SELECT를 모두 개별적으로 실행할 수 있습니다. 작은 SELECT는 다양한 시스템 카탈로그 뷰를 JOIN하는 방법을 보여 줍니다.

SELECT
		s.name        AS [Session-Name],
		'1_EVENT'     AS [Clause-Type],
		'Event-Name'  AS [Parameter-Name],
		e.name        AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_events   AS e

			ON  e.event_session_id = s.event_session_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name         AS [Session-Name],
		'2_EVENT_SET'  AS [Clause-Type],
		f.name         AS [Parameter-Name],
		f.value        AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_events   AS e

			ON  e.event_session_id = s.event_session_id

		JOIN  sys.server_event_session_fields   As f

			ON  f.event_session_id = s.event_session_id
			AND f.object_id        = e.event_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name              AS [Session-Name],
		'3_EVENT_ACTION'    AS [Clause-Type],

		a.package + '.' + a.name
		                    AS [Parameter-Name],

		'(Not_Applicable)'  AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_events   AS e

			ON  e.event_session_id = s.event_session_id

		JOIN  sys.server_event_session_actions  As a

			ON  a.event_session_id = s.event_session_id
			AND a.event_id         = e.event_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name                AS [Session-Name],
		'4_EVENT_PREDICATES'  AS [Clause-Type],
		e.predicate           AS [Parameter-Name],
		'(Not_Applicable)'    AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_events   AS e

			ON  e.event_session_id = s.event_session_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name              AS [Session-Name],
		'5_TARGET'          AS [Clause-Type],
		t.name              AS [Parameter-Name],
		'(Not_Applicable)'  AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_targets  AS t

			ON  t.event_session_id = s.event_session_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name          AS [Session-Name],
		'6_TARGET_SET'  AS [Clause-Type],
		f.name          AS [Parameter-Name],
		f.value         AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_targets  AS t

			ON  t.event_session_id = s.event_session_id

		JOIN  sys.server_event_session_fields   As f

			ON  f.event_session_id = s.event_session_id
			AND f.object_id        = t.target_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name               AS [Session-Name],
		'7_WITH_MAX_MEMORY'  AS [Clause-Type],
		'max_memory'         AS [Parameter-Name],
		s.max_memory         AS [Parameter-Value]
	FROM
		      sys.server_event_sessions  AS s
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name                  AS [Session-Name],
		'7_WITH_STARTUP_STATE'  AS [Clause-Type],
		'startup_state'         AS [Parameter-Name],
		s.startup_state         AS [Parameter-Value]
	FROM
		      sys.server_event_sessions  AS s
	WHERE
		s.name = 'event_session_test3'

ORDER BY
	[Session-Name],
	[Clause-Type],
	[Parameter-Name]
;

출력

다음 표에는 위의 SELECT JOIN UNION을 실행하여 얻은 출력이 나와 있습니다. 출력 매개 변수 이름과 값은 앞의 CREATE EVENT SESSION 문에서 명확하게 표시되는 항목에 매핑됩니다.

Session-Name Clause-Type Parameter-Name Parameter-Value
event_session_test3 1_EVENT Event-Name lock_deadlock
event_session_test3 2_EVENT_SET collect_database_name 1
event_session_test3 3_EVENT_ACTION sqlserver.client_hostname (Not_Applicable)
event_session_test3 3_EVENT_ACTION sqlserver.collect_system_time (Not_Applicable)
event_session_test3 3_EVENT_ACTION sqlserver.event_sequence (Not_Applicable)
event_session_test3 4_EVENT_PREDICATES ([sqlserver].[equal_i_sql_unicode_string]([database_name],N'InMemTest2') AND [package0].[counter]<=(16)) (Not_Applicable)
event_session_test3 5_TARGET event_file (Not_Applicable)
event_session_test3 6_TARGET_SET filename C:\Junk\event_session_test3_EF.xel
event_session_test3 6_TARGET_SET max_file_size 20
event_session_test3 6_TARGET_SET max_rollover_files 2
event_session_test3 7_WITH_MAX_MEMORY max_memory 4096
event_session_test3 7_WITH_STARTUP_STATE startup_state 1

이것으로 카탈로그 뷰 섹션이 완료되었습니다.

C. DMV(동적 관리 뷰)

이제 DMV로 이동합니다. 이 섹션에서는 각각 유용한 특정 비즈니스 목적으로 사용되는 몇 가지 Transact-SQL SELECT 문을 제공합니다. 또한 원하는 새 용도로 DMV를 함께 JOIN하는 방법도 SELECT를 통해 설명합니다.

DMV의 참조 설명서는 확장 이벤트 동적 관리 뷰에서 확인할 수 있습니다.

이 문서에서 다음 SELECT의 모든 실제 출력 행은 달리 명시하지 않는 한 SQL Server 2016에서 가져온 것입니다.

다음은 이 DMV 섹션 C에 있는 SELECT 목록입니다.

C.1 모든 패키지 목록

확장 이벤트 영역에서 사용할 수 있는 모든 개체는 시스템에 로드된 패키지에서 제공됩니다. 이 섹션에서는 모든 패키지와 해당 설명을 나열합니다.

SELECT  --C.1
		p.name         AS [Package],
		p.description  AS [Package-Description]
	FROM
		sys.dm_xe_packages  AS p
	ORDER BY
		p.name;

출력

패키지 목록은 다음과 같습니다.

Package Package-Description
filestream SQL Server FILESTREAM 및 FileTable에 대한 확장 이벤트
package0 기본 패키지. 모든 표준 형식, 맵, 비교 연산자, 작업 및 대상 포함
qds Extended events for Query Store
SecAudit Security Audit Events
sqlclr SQL CLR에 대한 확장 이벤트
sqlos SQL 운영 체제에 대한 확장 이벤트
SQLSatellite SQL Satellite에 대한 확장 이벤트
sqlserver Microsoft SQL Server에 대한 확장 이벤트
sqlserver Microsoft SQL Server에 대한 확장 이벤트
sqlserver Microsoft SQL Server에 대한 확장 이벤트
sqlsni Microsoft SQL Server에 대한 확장 이벤트
ucs Unified Communications 스택에 대한 확장 이벤트
XtpCompile XTP 컴파일에 대한 확장 이벤트
XtpEngine XTP 엔진에 대한 확장 이벤트
XtpRuntime Extended events for the XTP Runtime

앞의 두문자어 정의:

  • clr = .NET의 공용 언어 런타임
  • qds = 쿼리 데이터 저장소
  • sni = 서버 네트워크 인터페이스
  • ucs = Unified Communications 스택
  • xtp = 고성능 트랜잭션 처리

C.2 모든 개체 유형 개수

이 섹션에서는 이벤트 패키지에 포함된 개체의 유형에 대해 설명합니다. sys.dm_xe_objects에 있는 모든 개체 유형의 전체 목록은 각 유형의 개수와 함께 표시됩니다.

SELECT  --C.2
		Count(*)  AS [Count-of-Type],
		o.object_type
	FROM
		sys.dm_xe_objects  AS o
	GROUP BY
		o.object_type
	ORDER BY
		1  DESC;

출력

다음은 개체 유형별 개체 수입니다. 약 1915개의 개체가 있습니다.

Count-of-Type object_type
1303 이벤트
351 map
84 message
77 pred_compare
53 작업
46 pred_source
28 type
17 target

C.3 유형별로 정렬된 사용 가능한 모든 항목 SELECT

다음 SELECT는 각 개체에 대해 하나씩, 약 1915개 행을 반환합니다.

SELECT  --C.3
		o.object_type  AS [Type-of-Item],
		p.name         AS [Package],
		o.name         AS [Item],
		o.description  AS [Item-Description]
	FROM
		     sys.dm_xe_objects  AS o
		JOIN sys.dm_xe_packages AS p  ON o.package_guid = p.guid
	WHERE
		o.object_type IN ('action' , 'target' , 'pred_source')
		AND
		(
			(o.capabilities & 1) = 0
			OR
			o.capabilities IS NULL
		)
	ORDER BY
		[Type-of-Item],
		[Package],
		[Item];

출력

다음은 호기심을 유발하기 위해 앞의 SELECT에서 반환된 개체를 임의로 샘플링한 표입니다.

Type-of-Item Package Item Item-Description
작업 package0 callstack 현재 호출 스택 수집
작업 package0 debug_break 기본 디버거에서 프로세스 중단
작업 sqlos task_time 현재 작업 실행 시간 수집
작업 sqlserver sql_text SQL 텍스트 수집
이벤트 qds query_store_aprc_regression 쿼리 저장소가 쿼리 계획 성능에서 회귀 감지 시 발생
이벤트 SQLSatellite connection_accept 새로운 연결이 수락될 때 발생. 이 이벤트는 모든 연결 시도를 기록하는 역할을 합니다.
이벤트 XtpCompile cgen C 코드 생성 시작 시 발생
map qds aprc_state 쿼리 저장소 자동 계획 회귀 수정 상태
message package0 histogram_event_required 원본 유형이 0인 경우 'filtering_event_name' 매개 변수에 값이 필요합니다.
pred_compare package0 equal_ansi_string 두 ANSI 문자열 값 사이의 같음 연산자
pred_compare sqlserver equal_i_sql_ansi_string 두 SQL ANSI 문자열 값 사이의 같음 연산자
pred_source sqlos task_execution_time 현재 작업 실행 시간 가져오기
pred_source sqlserver client_app_name 현재 클라이언트 애플리케이션 이름 가져오기
target package0 etw_classic_sync_target ETW(Windows용 이벤트 추적) 동기 대상
target package0 event_counter event_counter 대상을 사용하여 이벤트 세션에서 각 이벤트의 발생 횟수를 계산합니다.
target package0 event_file Use the event_file target to save the event data to an XEL file, which can be archived and used for later analysis and review. 여러 XEL 파일을 병합하여 별도의 이벤트 세션에서 결합된 데이터를 볼 수 있습니다.
target package0 histogram 히스토그램 대상을 사용하여 이벤트와 관련된 특정 이벤트 데이터 필드 또는 작업을 기반으로 이벤트 데이터를 집계합니다. 히스토그램을 사용하면 이벤트 세션 기간 동안 이벤트 데이터의 분포를 분석할 수 있습니다.
target package0 pair_matching 페어링 대상
target package0 ring_buffer 비동기 링 버퍼 대상
type package0 Xml Well formed XML fragment

C.4 이벤트에 사용 가능한 데이터 필드

다음 SELECT는 이벤트 유형에 해당하는 모든 데이터 필드를 반환합니다.

  • WHERE 절 항목은 column_type = 'data'입니다.
  • 또한 o.name =에 대한 WHERE 절 값을 편집해야 합니다.
SELECT  -- C.4
		p.name         AS [Package],
		c.object_name  AS [Event],
		c.name         AS [Column-for-Predicate-Data],
		c.description  AS [Column-Description]
	FROM
		      sys.dm_xe_object_columns  AS c
		JOIN  sys.dm_xe_objects         AS o

			ON  o.name = c.object_name

		JOIN  sys.dm_xe_packages        AS p

			ON  p.guid = o.package_guid
	WHERE
		c.column_type = 'data'
		AND
		o.object_type = 'event'
		AND
		o.name        = '\<EVENT-NAME-HERE!>'  --'lock_deadlock'
	ORDER BY
		[Package],
		[Event],
		[Column-for-Predicate-Data];

출력

앞의 SELECT, WHERE o.name = 'lock_deadlock'에서 반환된 행은 다음과 같습니다.

  • 각 행은 sqlserver.lock_deadlock 이벤트에 대한 선택적 필터를 나타냅니다.
  • [Column-Description] 열은 다음 표에서 생략됩니다. 이 열의 값은 대개 NULL입니다.
  • 이 표는 대개 NULL이어서 생략된 Description 열을 제외한 실제 출력입니다.
  • 이 행은 WHERE object_type = 'lock_deadlock'입니다.
Package 이벤트 Column-for-Predicate-Data
sqlserver lock_deadlock associated_object_id
sqlserver lock_deadlock database_id
sqlserver lock_deadlock database_name
sqlserver lock_deadlock deadlock_id
sqlserver lock_deadlock duration
sqlserver lock_deadlock lockspace_nest_id
sqlserver lock_deadlock lockspace_sub_id
sqlserver lock_deadlock lockspace_workspace_id
sqlserver lock_deadlock mode
sqlserver lock_deadlock object_id
sqlserver lock_deadlock owner_type
sqlserver lock_deadlock resource_0
sqlserver lock_deadlock resource_1
sqlserver lock_deadlock resource_2
sqlserver lock_deadlock resource_description
sqlserver lock_deadlock resource_type
sqlserver lock_deadlock transaction_id

C.5 sys.dm_xe_map_values 및 이벤트 필드

다음 SELECT는 sys.dm_xe_map_values라는 까다로운 뷰에 대한 JOIN을 포함합니다.

SELECT의 목적은 이벤트 세션에 대해 선택할 수 있는 다양한 필드를 표시하는 것입니다. 이벤트 필드는 다음 두 가지 방법으로 사용할 수 있습니다.

  • 각 이벤트 발생에 대해 대상에 기록할 필드 값을 선택하기 위해
  • 대상에서 어떤 이벤트 발생을 전송할지 보관할지 필터링하기 위해
SELECT  --C.5
		dp.name         AS [Package],
		do.name         AS [Object],
		do.object_type  AS [Object-Type],
		'o--c'     AS [O--C],
		dc.name         AS [Column],
		dc.type_name    AS [Column-Type-Name],
		dc.column_type  AS [Column-Type],
		dc.column_value AS [Column-Value],
		'c--m'     AS [C--M],
		dm.map_value    AS [Map-Value],
		dm.map_key      AS [Map-Key]
	FROM
		      sys.dm_xe_objects         AS do
		JOIN  sys.dm_xe_object_columns  AS dc

			ON  dc.object_name = do.name

		JOIN  sys.dm_xe_map_values      AS dm

			ON  dm.name = dc.type_name

		JOIN  sys.dm_xe_packages        AS dp

			ON  dp.guid = do.package_guid
	WHERE
		do.object_type = 'event'
		AND
		do.name        = '\<YOUR-EVENT-NAME-HERE!>'  --'lock_deadlock'
	ORDER BY
		[Package],
		[Object],
		[Column],
		[Map-Value];

출력

다음은 앞의 T-SQL SELECT의 실제 출력 행 153개의 샘플링입니다. resource_type 행은 이 문서의 다른 위치에 있는 event_session_test3 예제에서 사용되는 조건자 필터링과 관련이 있습니다.

/***  5 sampled rows from the actual 153 rows returned.
	NOTE:  'resource_type' under 'Column'.

Package     Object          Object-Type   O--C   Column          Column-Type-Name     Column-Type   Column-Value   C--M   Map-Value        Map-Key
-------     ------          -----------   ----   ------          ----------------     -----------   ------------   ----   ---------        -------
sqlserver   lock_deadlock   event         o--c   CHANNEL         etw_channel          readonly      2              c--m   Operational      4
sqlserver   lock_deadlock   event         o--c   KEYWORD         keyword_map          readonly      16             c--m   access_methods   1024
sqlserver   lock_deadlock   event         o--c   mode            lock_mode            data          NULL           c--m   IX               8
sqlserver   lock_deadlock   event         o--c   owner_type      lock_owner_type      data          NULL           c--m   Cursor           2
sqlserver   lock_deadlock   event         o--c   resource_type   lock_resource_type   data          NULL           c--m   PAGE             6

Therefore, on your CREATE EVENT SESSION statement, in its ADD EVENT WHERE clause,
you could put:
	WHERE( ... resource_type = 6 ...)  -- Meaning:  6 = PAGE.
***/

C.6 대상에 대한 매개 변수

다음 SELECT는 대상에 대한 모든 매개 변수를 반환합니다. 각 매개 변수에는 필수 여부를 나타내는 태그가 지정됩니다. 매개 변수에 할당하는 값은 대상의 동작에 영향을 줍니다.

  • WHERE 절 항목은 object_type = 'customizable'입니다.
  • 또한 o.name =에 대한 WHERE 절 값을 편집해야 합니다.
SELECT  --C.6
		p.name        AS [Package],
		o.name        AS [Target],
		c.name        AS [Parameter],
		c.type_name   AS [Parameter-Type],

		CASE c.capabilities_desc
			WHEN 'mandatory' THEN 'YES_Mandatory'
			ELSE 'Not_mandatory'
		END  AS [IsMandatoryYN],

		c.description AS [Parameter-Description]
	FROM
		      sys.dm_xe_objects   AS o
		JOIN  sys.dm_xe_packages  AS p

			ON  o.package_guid = p.guid

		LEFT OUTER JOIN  sys.dm_xe_object_columns  AS c

			ON  o.name        = c.object_name
			AND c.column_type = 'customizable'  -- !
	WHERE
		o.object_type = 'target'
		AND
		o.name     LIKE '%'    -- Or '\<YOUR-TARGET-NAME-HERE!>'.
	ORDER BY
		[Package],
		[Target],
		[IsMandatoryYN]  DESC,
		[Parameter];

출력

다음 매개 변수 행은 SQL Server 2016에서 앞의 SELECT가 반환한 매개 변수의 하위 집합입니다.

/***  Actual output, all rows, where target name = 'event_file'.
Package    Target       Parameter            Parameter-Type       IsMandatoryYN   Parameter-Description
-------    ------       ---------            --------------       -------------   ---------------------
package0   event_file   filename             unicode_string_ptr   YES_Mandatory   Specifies the location and file name of the log
package0   event_file   increment            uint64               Not_mandatory   Size in MB to grow the file
package0   event_file   lazy_create_blob     boolean              Not_mandatory   Create blob upon publishing of first event buffer, not before.
package0   event_file   max_file_size        uint64               Not_mandatory   Maximum file size in MB
package0   event_file   max_rollover_files   uint32               Not_mandatory   Maximum number of files to retain
package0   event_file   metadatafile         unicode_string_ptr   Not_mandatory   Not used
***/

C.7 target_data 열을 XML로 캐스팅하는 DMV SELECT

이 DMV SELECT는 활성 이벤트 세션의 대상에서 데이터 행을 반환합니다. 데이터는 XML로 캐스팅되어, 반환된 셀을 클릭할 수 있으므로 SSMS에서 쉽게 표시할 수 있습니다.

  • 이벤트 세션이 중지되면 이 SELECT는 0개의 행을 반환합니다.
  • s.name =에 대한 WHERE 절 값을 편집해야 합니다.
SELECT  --C.7
		s.name,
		t.target_name,
		CAST(t.target_data AS XML)  AS [XML-Cast]
	FROM
		      sys.dm_xe_session_targets  AS t
		JOIN  sys.dm_xe_sessions         AS s

			ON s.address = t.event_session_address
	WHERE
		s.name = '\<Your-Session-Name-Here!>';

출력, 해당 XML 셀을 포함한 유일한 행

다음은 앞의 SELECT에서 출력되는 유일한 행입니다. XML-Cast 열에는 SSMS가 XML로 이해하는 XML 문자열이 포함되어 있습니다. 따라서 SSMS는 XML-Cast 셀을 클릭할 수 있어야 한다고 이해합니다.

이 실행의 특징:

  • s.name = 값이 checkpoint_begin 이벤트에 대한 이벤트 세션으로 설정되었습니다.
  • 대상은 ring_buffer였습니다.
name                              target_name   XML-Cast
----                              -----------   --------
checkpoint_session_ring_buffer2   ring_buffer   <RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="2" eventCount="2" droppedCount="0" memoryUsed="104"><event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T01:28:23.508Z"><data name="database_id"><type name="uint32" package="package0" /><value>5</value></data></event><event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T01:28:26.975Z"><data name="database_id"><type name="uint32" package="package0" /><value>5</value></data></event></RingBufferTarget>

출력, 셀 클릭 시 깔끔하게 표시되는 XML

XML-Cast 셀을 클릭하면 다음과 같이 깔끔하게 표시됩니다.

<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="2" eventCount="2" droppedCount="0" memoryUsed="104">
  <event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T01:28:23.508Z">
    <data name="database_id">
      <type name="uint32" package="package0" />
      <value>5</value>
    </data>
  </event>
  <event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T01:28:26.975Z">
    <data name="database_id">
      <type name="uint32" package="package0" />
      <value>5</value>
    </data>
  </event>
</RingBufferTarget>

C.8 디스크 드라이브에서 event_file 데이터를 검색하는 함수에서 SELECT

이벤트 세션이 일부 데이터를 수집하고 나중에 중지되었다고 가정합니다. 세션이 event_file 대상을 사용하도록 정의된 경우에도 sys.fn_xe_target_read_file 함수를 호출하여 데이터를 검색할 수 있습니다.

  • 이 SELECT를 실행하기 전에 경로와 파일 이름을 함수 호출의 매개 변수로 편집해야 합니다.
    • 세션을 다시 시작할 때마다 SQL 시스템이 실제 .XEL 파일 이름에 포함시키는 추가 숫자는 무시해도 됩니다. 기본 루트 이름과 확장명만 지정합니다.
SELECT  --C.8
		f.module_guid,
		f.package_guid,
		f.object_name,
		f.file_name,
		f.file_offset,
		CAST(f.event_data AS XML)  AS [Event-Data-As-XML]
	FROM
		sys.fn_xe_file_target_read_file(

			'\<YOUR-PATH-FILE-NAME-ROOT-HERE!>*.xel',
			--'C:\Junk\Checkpoint_Begins_ES*.xel',  -- Example.

			NULL, NULL, NULL
		)  AS f;

출력, SELECT FROM 함수에서 반환된 행

다음은 앞의 SELECT FROM 함수에서 반환된 행입니다. 맨 오른쪽 XML 열에는 특히 이벤트 발생에 대한 데이터가 포함되어 있습니다.

module_guid                            package_guid                           object_name        file_name                                                           file_offset   Event-Data-As-XML
-----------                            ------------                           -----------        ---------                                                           -----------   -----------------
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   checkpoint_begin   C:\Junk\Checkpoint_Begins_ES_20160615bb-_0_131125086091700000.xel   5120          <event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T03:30:14.023Z"><data name="database_id"><value>5</value></data><action name="session_id" package="sqlserver"><value>60</value></action><action name="database_id" package="sqlserver"><value>5</value></action></event>
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   checkpoint_end     C:\Junk\Checkpoint_Begins_ES_20160615bb-_0_131125086091700000.xel   5120          <event name="checkpoint_end" package="sqlserver" timestamp="2016-07-09T03:30:14.025Z"><data name="database_id"><value>5</value></data></event>
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   checkpoint_begin   C:\Junk\Checkpoint_Begins_ES_20160615bb-_0_131125086091700000.xel   5632          <event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T03:30:17.704Z"><data name="database_id"><value>5</value></data><action name="session_id" package="sqlserver"><value>60</value></action><action name="database_id" package="sqlserver"><value>5</value></action></event>
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   checkpoint_end     C:\Junk\Checkpoint_Begins_ES_20160615bb-_0_131125086091700000.xel   5632          <event name="checkpoint_end" package="sqlserver" timestamp="2016-07-09T03:30:17.709Z"><data name="database_id"><value>5</value></data></event>

출력, 하나의 XML 셀

다음은 앞의 반환된 행 집합에서 첫 번째 XML 셀의 내용입니다.

<event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T03:30:14.023Z">
  <data name="database_id">
    <value>5</value>
  </data>
  <action name="session_id" package="sqlserver">
    <value>60</value>
  </action>
  <action name="database_id" package="sqlserver">
    <value>5</value>
  </action>
</event>