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

적용 대상:SQL ServerAzure SQL DatabaseAzure 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 SELECTing은 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. 카탈로그 뷰

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

예기치 않은 오류를 방지하려면 매달 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의 개체 탐색기에서 관리>확장 이벤트를 확장한 다음 세션 새 세션을 마우스 오른쪽 단추로 클릭하여 새 세션 대화 상자를 시작할 수 있습니다.>

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

New Session > General, Start the event session at server startup.

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

New Session > Events, Global Fields (Actions)

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

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

New Session > Events, Filter Predicate Fields (Actions)

다음으로 Data Storage 섹션에서 event_file 대상으로 선택되었음을 확인합니다. 또한 파일 롤오버 사용 옵션이 선택되었습니다.

New Session > Data Storage, eventfile_enablefileroleover

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

New Session > Advanced, Maximum dispatch latency

그러면 이벤트 세션 정의에 대한 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 문에서 명확하게 표시되는 항목에 매핑됩니다.

세션 이름 Clause-Type Parameter-Name 매개 변수-값
event_session_test3 1_EVENT 이벤트 이름 lock_deadlock
event_session_test3 2_EVENT_SET collect_database_name 6
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 6

그러면 카탈로그 뷰에 대한 섹션이 완료됩니다.

C. DMV(동적 관리 뷰)

이제 DMV로 이동합니다. 이 섹션에서는 각각 특정한 유용한 비즈니스 목적을 제공하는 여러 Transact-SQL SELECT 문을 제공합니다. 또한 SELECT는 원하는 새 용도로 DMV를 조인하는 방법을 보여 줍니다.

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;

출력

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

패키지 패키지 설명
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 통합 통신 스택에 대한 확장 이벤트
XtpCompile XTP 컴파일에 대한 확장 이벤트
XtpEngine XTP 엔진에 대한 확장 이벤트
XtpRuntime Extended events for the XTP Runtime

앞의 두문자어 정의:

  • clr = .NET의 공용 언어 런타임
  • qds = 쿼리 데이터 저장소
  • sni = 서버 네트워크 인터페이스
  • ucs = Unified Communications Stack
  • 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개 개체가 있습니다.

형식 개수 object_type
1303 event
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 패키지 상품 항목 설명
작업 package0 호출 스택 현재 호출 스택 수집
작업 package0 debug_break Break the process in the default debugger
작업 sqlos task_time 현재 작업 실행 시간 수집
작업 sqlserver sql_text SQL 텍스트 수집
event qds query_store_aprc_regression 쿼리 계획 성능에서 쿼리 저장소가 회귀를 감지하면 발생합니다.
event SQLSatellite connection_accept 새 연결이 수락되면 발생합니다. 이 이벤트는 모든 연결 시도를 기록하는 역할을 합니다.
event 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 Get the current client application name
target package0 etw_classic_sync_target ETW(Windows용 이벤트 추적) 동기 대상
target package0 event_counter Use the event_counter target to count the number of occurrences of each event in the event session.
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 이벤트에 대한 선택적 필터를 나타냅니다.
  • [열 설명] 열은 다음 표시에서 생략됩니다. 해당 값은 종종 NULL입니다.
  • 일반적으로 NULL인 생략된 설명 열을 제외하고 실제 출력입니다.
  • 이러한 행은 object_type = 'lock_deadlock'입니다.
패키지 이벤트 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 = '사용자 지정 가능'입니다.
  • 또한 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 DMV SELECT 캐스팅 target_data 열을 XML로

이 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 캐스트 셀을 클릭할 수 있도록 해야 한다는 것을 이해합니다.

이 실행의 경우:

  • 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 캐스트 셀을 클릭하면 다음과 같은 예쁜 표시가 나타납니다.

<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>

디스크 드라이브에서 event_file 데이터를 검색하는 함수에서 C.8 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>