적용 대상:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric 미리 보기의 SQL 데이터베이스
이 문서에서는 확장 이벤트 대상을 사용하는 시기와 방법에 대해 설명합니다. 이 문서에서는 각 대상에 대해 다음을 설명합니다.
- 이벤트 데이터 수집 및 보고 기능
- 대상을 사용하는 이벤트 세션의 예
다음 표에서는 서로 다른 SQL 플랫폼에서 각 대상 형식의 가용성을 설명합니다.
| 대상 형식 | SQL 서버 | Azure SQL Database 및 Fabric의 SQL 데이터베이스 | Azure SQL 관리형 인스턴스 |
|---|---|---|---|
| 이벤트_파일 | 예 | 예 | 예 |
| 고리 버퍼 | 예 | 예 | 예 |
| event_stream | 예 | 예 | 예 |
| 히스토그램 | 예 | 예 | 예 |
| 이벤트 카운터 | 예 | 예 | 예 |
| 페어_매칭 | 예 | 아니요 | 아니요 |
| etw_classic_sync_target | 예 | 아니요 | 아니요 |
다르게 명시되지 않는 한 대상은 비동기적으로 수신하는 데이터를 처리합니다.
이 문서를 최대한 활용하려면 다음 조건을 충족해야 합니다.
- 빠른 시작: 확장 이벤트에 설명된 확장 이벤트의 기본 사항을 숙지하고 있어야 합니다.
- 최신 버전의 SSMS(SQL Server Management Studio)를 사용합니다.
event_file 대상
대상은 event_file 메모리 버퍼의 이벤트 세션 출력을 디스크 파일 또는 Azure Storage의 Blob에 기록합니다.
filename절에ADD TARGET매개 변수를 지정합니다. 파일 확장명은xel이어야 합니다.선택한 파일 이름은 시스템에서
xel확장자를 추가하여, 날짜-시간 기반 숫자 값이 덧붙여진 접두사로 사용됩니다.필요에 따라 매개 변수를
MAX_FILE_SIZE지정할 수 있습니다. 새 파일을 만들기 전에 파일이 증가할 수 있는 최대 크기(MB)를 정의합니다.필요에 따라 현재 파일 외에도 파일 시스템에 유지할 최대 파일 수를 선택하는 옵션을 지정할
MAX_ROLLOVER_FILES수 있습니다. 기본값은UNLIMITED입니다.MAX_ROLLOVER_FILES평가되는 경우 파일 수가 설정을 초과MAX_ROLLOVER_FILES하면 이전 파일이 삭제됩니다.
중요합니다
세션에 추가된 이벤트에 따라 대상에 의해 event_file 생성된 파일에 중요한 데이터가 포함될 수 있습니다. 불필요한 읽기 액세스 권한을 부여하지 않도록 파일 시스템을 신중하게 검토하고 상속된 액세스를 포함하여 디렉터리 및 개별 .xel 파일에 대한 권한을 공유합니다.
최소 권한의 원칙을 따릅니다. 실수로 중요한 데이터를 수집할 위험을 줄이려면 중요한 데이터를 수집할 수 있는 경우 장기 실행 이벤트 세션을 방지합니다.
참고 항목
Azure SQL Database 및 Azure SQL Managed Instance는 Azure Storage 의 Blob만 매개 변수 값 filename 으로 지원합니다.
event_file Azure SQL Database, Fabric의 SQL Database 또는 Azure SQL Managed Instance에 대한 코드 예제는 Azure Storage에서 event_file 대상으로 이벤트 세션 만들기를 참조하세요.
로컬 파일 시스템에서 event_file 대상으로 이벤트 세션 만들기
SSMS 또는 T-SQL과 함께 로컬 파일 스토리지를 사용하여 event_file 이벤트 세션을 만드는 연습은 빠른 시작: 확장 이벤트를 참조하세요.
Azure Storage에서 event_file 대상으로 이벤트 세션 만들기
Azure Storage에서 스토리지 계정을 만드는 방법에 대한 자세한 설명은 스토리지 계정 만들기를 참조하세요. Azure Portal, PowerShell, Azure SQL, ARM 템플릿 또는 Bicep 템플릿을 사용하여 스토리지 계정을 만들 수 있습니다. 다음과 같은 계정을 사용합니다.
-
Standard general-purpose v2계정입니다. -
Hot을 사용합니다. - Azure VM(Azure Virtual Machine)에서 SQL Server를 사용하는 경우 스토리지 계정은 Azure VM과 동일한 Azure 지역에 있어야 합니다.
- 계층 구조 네임스페이스를 사용하도록 설정하지 않았습니다.
다음으로, Azure Portal을 사용하여 이 스토리지 계정에 컨테이너를 만듭니 다. PowerShell을 사용하거나 Azure CLI를 사용하여 컨테이너를 만들 수도 있습니다.
만든 스토리지 계정 및 컨테이너 의 이름을 확인합니다. 다음 단계에서 사용합니다.
이벤트 데이터를 읽고 쓰려면 데이터베이스 엔진에 특정 액세스 권한이 필요합니다. 선택한 인증 유형인 관리 ID 또는 SAS(공유 액세스 서명) 토큰을 사용한 비밀 기반 인증에 따라 이 액세스 권한을 다르게 부여합니다.
Azure Storage에 인증하려면 데이터베이스 엔진에 사용할 인증 종류를 알려주고 비밀 기반 인증에 대한 비밀을 제공하는 서버 범위 자격 증명 또는 데이터베이스 범위 자격 증명이 필요합니다. 이 자격 증명을 만들려면 데이터베이스 권한이 필요합니다 CONTROL .
SQL Server 및 Azure SQL Managed Instance의 경우 데이터베이스에서 master 이 권한이 필요합니다. 기본적으로 사용 권한은 인스턴스에서 데이터베이스 역할db_owner의 master 멤버 및 서버 역할의 sysadmin 멤버에 의해 유지됩니다. Fabric의 Azure SQL Database 및 SQL 데이터베이스의 경우 데이터베이스 소유자(dbo), 데이터베이스 역할의 db_owner 멤버 및 논리 서버 관리자가 이 권한을 보유합니다.
자격 증명이 만들어지면, 나머지 이벤트 세션 생성 단계에는 CONTROL 권한이 필요하지 않습니다. 특정 권한을 참조하세요.
관리 ID를 사용하여 액세스 권한 부여
Microsoft Entra 인증에서 관리 ID를 사용하는 경우 컨테이너에 대한 Storage Blob 데이터 기여자 RBAC 역할을 데이터베이스 엔진에서 사용하는 관리 ID에 할당합니다. 자세한 내용은 SQL 플랫폼에 따라 다음을 참조하세요.
- Azure SQL Database 논리 서버의 관리 ID입니다.
- Azure SQL 관리형 인스턴스의 관리 ID입니다.
- SQL Server 인스턴스를 호스팅하는 Azure VM의 관리 ID입니다. 자세한 내용은 Azure 리소스에 대한 관리 ID가 Azure 가상 머신에서 작동하는 방법을 참조하세요.
- Arc 지원 SQL Server 인스턴스의 관리 ID입니다.
RBAC 역할 할당이 완료되면 다음 단계를 사용합니다.
T-SQL을 사용하여 자격 증명을 만듭니다.
다음 T-SQL 일괄 처리를 실행하기 전에 다음을 변경합니다.
- 세 번 발생하는 각
https://<storage-account-name>.blob.core.windows.net/<container-name>에 대해<storage-account-name>을 귀하의 스토리지 계정 이름으로,<container-name>를 컨테이너 이름으로 바꾸십시오. URL 끝에 후행 슬래시가 없는지 확인합니다.
서버 범위 자격 증명 만들기: (SQL Server, Azure SQL Managed Instance에 적용됨)
SSMS와 같은 클라이언트 도구를 사용하여 새 쿼리 창을 열고, 이벤트 세션을 만들 인스턴스의 데이터베이스에 연결
master하고, 다음 T-SQL 일괄 처리를 붙여넣습니다./* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* When using managed identity, the credential does not contain a secret */ CREATE CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'MANAGED IDENTITY';데이터베이스 범위 자격 증명 만들기: (Azure SQL Database, Azure SQL Managed Instance, Fabric의 SQL 데이터베이스에 적용됨)
SSMS와 같은 클라이언트 도구를 사용하여 새 쿼리 창을 열고, 이벤트 세션을 만드는 사용자 데이터베이스에 연결하고, 다음 T-SQL 일괄 처리를 붙여넣습니다.
master데이터베이스가 아닌, 사용자 데이터베이스에 연결해야 합니다./* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.database_credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* When using managed identity, the credential does not contain a secret */ CREATE DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'MANAGED IDENTITY';- 세 번 발생하는 각
그런 다음, 단계에 따라 Azure Storage에서 event_file 대상으로 SSMS에서 이벤트 세션을 만듭니다.
SAS(공유 액세스 서명) 토큰을 사용하여 액세스 권한 부여
비밀 기반 인증을 사용하는 경우 컨테이너에 대한 SAS(공유 액세스 서명) 토큰을 만듭니다. 이 인증 유형을 사용하려면 스토리지 계정에 대해 스토리지 계정 키 액세스 허용 옵션을 사용하도록 설정해야 합니다. 자세한 내용은 Azure Storage 계정에 대한 공유 키 권한 부여 방지를 참조하세요.
Azure Portal에서 만든 스토리지 계정 및 컨테이너로 이동합니다. 컨테이너를 선택하고 공유 액세스 토큰 설정>으로 이동합니다.
SAS 토큰은 다음 요구 사항을 충족해야 합니다.
-
사용 권한은 ,
Read,WriteDelete로List설정됩니다. - 시작 시간 및 만료 시간은 이벤트 세션의 수명을 포함해야 합니다. 만드는 SAS 토큰은 이 시간 간격 내에서만 작동합니다.
- Azure SQL Database, Azure SQL Managed Instance 및 Fabric의 SQL 데이터베이스의 경우 SAS 토큰에는 IP 주소 제한이 없어야 합니다.
SAS 토큰 및 URL 생성 단추를 선택합니다. SAS 토큰은 Blob SAS 토큰 상자에 있습니다. 복사하여 다음 단계에서 사용할 수 있습니다.
중요합니다
SAS 토큰은 이 컨테이너에 대한 읽기 및 쓰기 액세스를 제공합니다. 암호 또는 다른 비밀을 처리하는 것처럼 처리합니다.
-
사용 권한은 ,
T-SQL을 사용하여 SAS 토큰을 저장할 자격 증명을 만듭니다.
다음 T-SQL 일괄 처리를 실행하기 전에 다음을 변경합니다.
서버 범위 자격 증명을 만들고
CREATE MASTER KEY문을 사용할 때,<password>를 마스터 키를 보호하는 강력한 암호로 바꾸십시오. 자세한 내용은 CREATE MASTER KEY를 참조하세요.세 번 발생하는 각
https://<storage-account-name>.blob.core.windows.net/<container-name>에 대해<storage-account-name>을 귀하의 스토리지 계정 이름으로,<container-name>를 컨테이너 이름으로 바꾸십시오.SECRET절에서<sas-token>을(를) 이전 단계에서 복사한 SAS 토큰으로 바꿉니다.
서버 범위 자격 증명 만들기: (SQL Server, Azure SQL Managed Instance에 적용됨)
SSMS와 같은 클라이언트 도구를 사용하여 새 쿼리 창을 열고, 이벤트 세션을 만든 인스턴스에 있는 데이터베이스
master에 연결한 다음, 다음의 T-SQL 배치를 붙여넣습니다./* Create a master key to protect the secret of the credential */ IF NOT EXISTS (SELECT 1 FROM sys.symmetric_keys WHERE name = '##MS_DatabaseMasterKey##') CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>' /* The name of the credential must match the URL of the blob container. */; IF EXISTS (SELECT 1 FROM sys.credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* The secret is the SAS token for the container. */ CREATE CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<sas-token>';데이터베이스 범위 자격 증명 만들기: (Azure SQL Database, Azure SQL Managed Instance, Fabric의 SQL 데이터베이스에 적용됨)
SSMS와 같은 클라이언트 도구를 사용하여 새 쿼리 창을 열고, 이벤트 세션을 만드는 데이터베이스에 연결하고, 다음 T-SQL 일괄 처리를 붙여넣습니다.
master데이터베이스가 아닌, 사용자 데이터베이스에 연결해야 합니다./* The name of the credential must match the URL of the blob container. */ IF EXISTS (SELECT 1 FROM sys.database_credentials WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>') DROP DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>]; /* The secret is the SAS token for the container. */ CREATE DATABASE SCOPED CREDENTIAL [https://<storage-account-name>.blob.core.windows.net/<container-name>] WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<sas-token>';그런 다음, 다음 섹션의 단계에 따라 Azure Storage에서 event_file 대상으로 SSMS에서 이벤트 세션을 만듭니다.
Azure Storage에서 event_file 대상으로 SSMS에서 이벤트 세션 만들기
스토리지 컨테이너에 대한 액세스를 제공하는 자격 증명이 만들어지면 이벤트 세션을 만들 수 있습니다. 자격 증명을 만드는 것과 달리 이벤트 세션을 만들 때는 권한이 필요하지 CONTROL 않습니다. 자격 증명이 만들어지면 더 제한된 권한이 있더라도 이벤트 세션을 만들 수 있습니다. 특정 권한을 참조하세요.
SSMS에서 새 이벤트 세션을 만들려면 다음을 수행합니다.
SQL Server 및 Azure SQL Managed Instance의 경우 관리 폴더 아래에서 확장 이벤트 노드를 확장합니다. Fabric의 Azure SQL Database 및 SQL 데이터베이스의 경우 데이터베이스 아래에서 확장 이벤트 노드를 확장합니다.
세션 폴더를 마우스 오른쪽 단추로 클릭하고 새 세션을 선택합니다...
일반 페이지에서 다음 코드 샘플에 대한 세션
example-session의 이름을 입력합니다.이벤트 페이지에서 세션에 추가할 하나 이상의 이벤트를 선택합니다. 예를 들어
sql_batch_starting이벤트를 선택할 수 있습니다.데이터 스토리지 페이지에서 대상 유형으로 선택합니다
event_file. 스토리지 컨테이너의 URL을 스토리지 URL 상자에 붙여넣습니다. 이 URL의 끝에 슬래시(/)를 입력한 다음 파일(Blob) 이름을 입력합니다. 예:https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel.이제 세션이 구성되었으므로 필요에 따라 스크립트 단추를 선택하여 세션의 T-SQL 스크립트를 만들어 나중에 저장할 수 있습니다.
확인을 선택하여 세션을 생성합니다.
개체 탐색기에서 세션 폴더를 확장하여 생성한 이벤트 세션을 확인합니다. 기본값으로 세션은 생성될 때 시작되지 않습니다. 세션을 시작하려면 세션 이름을 마우스 오른쪽 단추로 클릭하고 세션 시작을 선택합니다. 세션이 실행되면 세션 중지 를 선택하여 나중에 중지할 수 있습니다.
T-SQL 일괄 처리가 실행되면 세션은 스토리지 컨테이너의 sql_batch_startingexample-session.xel Blob에 이벤트를 씁니다.
참고 항목
SQL Managed Instance의 경우 스토리지 컨테이너 URL을 데이터 스토리지 페이지에 붙여넣는 대신, 스크립트 버튼을 사용하여 세션의 T-SQL 스크립트를 생성합니다. 컨테이너 URL을 인수의 값 filename 으로 지정하고 스크립트를 실행하여 세션을 만듭니다.
T-SQL의 Azure Storage에서 event_file 대상으로 이벤트 세션 만들기
다음은 Azure Storage 기반 CREATE EVENT SESSION 대상을 추가하는 ADD TARGETevent_file 절의 예입니다.
CREATE EVENT SESSION [example-session]
ON SERVER
ADD EVENT sqlserver.sql_batch_starting
ADD TARGET package0.event_file
(
SET filename = N'https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel'
)
GO
Azure SQL Database나 Fabric의 SQL 데이터베이스에서 이 예제를 사용하려면 ON SERVER를 ON DATABASE으로 교체합니다.
Azure Storage에서 event_file 대상으로 이벤트 세션 문제 해결
다음 목록에는 Azure Storage를 사용하는 확장 이벤트 세션을 시작할 때 발생할 수 있는 오류와 오류에 대한 설명이 포함되어 있습니다.
-
운영 체제에서 '액세스가 거부되었습니다.' 오류 5를 반환했습니다.
- 관리 ID 인증을 사용하는 경우:
- 데이터베이스 엔진에서 사용하는 관리 ID에는 필요한 RBAC 역할 할당이 없습니다. 자세한 내용은 관리 ID를 사용하여 액세스 권한 부여를 참조하세요.
- 스토리지 계정 방화벽 을 사용하도록 설정하고 신뢰할 수 있는 Azure 서비스가 스토리지 계정에 액세스할 수 있도록 허용하는 예외도 사용하도록 설정되어 있지만
Microsoft.Sql/servers, 논리 서버에 대한 리소스 인스턴스가 액세스 권한이 부여된 리소스 인스턴스 목록에 추가되지 않았습니다. 자세한 내용은 Azure 리소스 인스턴스에서 액세스 권한 부여를 참조하세요. - 강제 모드에서 네트워크 보안 경계 를 사용하는 경우 데이터베이스와 스토리지 계정은 동일한 경계에 있지 않습니다.
- SAS 토큰 인증을 사용하는 경우:
- 스토리지 계정 방화벽 을 사용할 수 있습니다. SAS 토큰 인증을 사용하는 이벤트 세션에는 지원되지 않습니다.
- SAS 토큰에 충분한 권한이 없거나 만료되었습니다. 자세한 내용은 SAS 토큰을 사용하여 액세스 권한 부여를 참조하세요.
- 강제 모드로 네트워크 보안 경계 를 사용하는 경우 데이터베이스에서 무제한 아웃바운드 통신을 허용하고 스토리지 계정에 대한 무제한 인바운드 통신을 허용하는 액세스 규칙이 적용되지 않습니다.
- 관리 ID 인증을 사용하는 경우:
-
운영 체제에서 '지정한 네트워크 암호가 올바르지 않습니다.' 오류 86을 반환했습니다.
- Blob 컨테이너 URL과 일치하는 이름을 가진 데이터베이스 범위 자격 증명(Azure SQL Database의 경우) 또는 서버 범위 자격 증명(Azure SQL Managed Instance 또는 SQL Server의 경우)이 없습니다. 자세한 내용은 관리 ID를 사용하여 액세스 권한을 부여 하거나 SAS 토큰을 사용하여 액세스 권한을 부여하는 예제를 참조하세요.
- 자격 증명 이름은 슬래시(
/)로 끝납니다. 자격 증명 이름은 후행 슬래시를 포함하지 않는 컨테이너 이름으로 끝나야 합니다.
-
운영 체제에서 '지정된 경로를 찾을 수 없습니다.' 오류 3을 반환했습니다.
- Blob 컨테이너 URL에 지정된 컨테이너가 없습니다.
-
운영 체제에서 '데이터가 잘못되었습니다.' 오류 13을 반환했습니다.
- Blob 컨테이너에 불변성 정책이 있습니다. 변경할 수 없는 스토리지는 이벤트 세션에 대해 지원되지 않습니다.
- 스토리지 계정에는 계층 구조 네임스페이스가 활성화되어 있습니다. 계층 구조 네임스페이스를 사용하는 스토리지 계정은 이벤트 세션에서 지원되지 않습니다.
sys.fn_xe_file_target_read_file() 함수
event_file 대상은 수신한 데이터를 사람이 읽을 수 없는 이진 형식으로 저장합니다. 이 sys.fn_xe_file_target_read_file 함수를 사용하면 파일의 xel 내용을 관계형 행 집합으로 나타낼 수 있습니다. 사용 예제를 비롯한 자세한 내용은 sys.fn_xe_file_target_read_file 참조하세요.
ring_buffer 대상
대상은 ring_buffer 이벤트 세션을 빠르게 시작하고 메모리에서만 이벤트 데이터를 수집하는 데 유용합니다. 링 버퍼에서 사용 가능한 메모리가 이벤트에서 사용되는 경우 이전 이벤트는 삭제됩니다. 이벤트 세션을 중지하면 대상에 대한 ring_buffer 모든 세션 출력도 삭제됩니다.
다음 예와 같이 ring_buffer 대상의 데이터를 XML로 변환하여 사용합니다. 이 변환 과정에서 4MB XML 문서에 맞지 않는 데이터는 모두 생략됩니다. 따라서 더 큰 MAX_MEMORY 값을 사용하거나 이 매개 변수를 기본값으로 두어 링 버퍼에서 더 많은 이벤트를 캡처하더라도 XML 마크업 및 유니코드 문자열의 오버헤드를 고려할 때 XML 문서 크기의 4MB 제한으로 인해 이벤트를 모두 이용하지 못할 수 있습니다.
예를 들어 XML 문서의 truncated 특성이 1로 설정된 경우 XML로 변환하는 동안 링 버퍼의 내용이 생략된다는 것을 알고 있습니다. 다음은 예입니다.
<RingBufferTarget truncated="1" processingTime="0" totalEventsProcessed="284" eventCount="284" droppedCount="0" memoryUsed="64139">
팁
대상을 ring_buffer 추가할 때 해당 MAX_MEMORY 매개 변수를 1,024KB 이하로 설정합니다. 더 큰 값을 사용하면 메모리 사용량이 불필요하게 증가할 수 있습니다.
기본적으로 MAX_MEMORY 대상의 ring_buffer 경우 SQL Server에서 제한되지 않으며 Azure SQL Database, Azure SQL Managed Instance 및 Fabric의 SQL 데이터베이스에서 32MB로 제한됩니다.
ring_buffer 대상으로 이벤트 세션 만들기
다음은 ring_buffer 대상을 사용하여 lock_acquired 이벤트를 수집하는 이벤트 세션을 만들고, 링 버퍼의 총 이벤트 수를 100으로 제한하는 예제입니다. 이 예제에서는 매개 변수가 MAX_MEMORY 두 번 나타납니다. 한 번은 대상 메모리를 1,024KB로 설정하고 ring_buffer 한 번은 이벤트 세션 버퍼 메모리를 2MB로 설정합니다.
Azure SQL Database나 Fabric의 SQL 데이터베이스에서 이 예제를 사용하려면 ON SERVER를 ON DATABASE으로 교체합니다.
CREATE EVENT SESSION ring_buffer_lock_acquired
ON SERVER
ADD EVENT sqlserver.lock_acquired
ADD TARGET package0.ring_buffer
(
SET MAX_EVENTS_LIMIT = 100,
MAX_MEMORY = 1024
)
WITH
(
MAX_MEMORY = 2 MB,
MAX_DISPATCH_LATENCY = 3 SECONDS
);
이벤트 세션을 시작하려면 다음 문을 실행합니다.
ALTER EVENT SESSION ring_buffer_lock_acquired
ON SERVER
STATE = START;
SSMS의 링 버퍼에서 수집된 이벤트 데이터를 보려면 세션 노드를 확장하고 대상을 package0.ping_buffer 선택합니다. 데이터가 XML로 표시됩니다.
세션이 ring_buffer 활성화된 동안 관계형 행 집합의 대상에서 이벤트 데이터를 보려면 XQuery 식을 사용하여 XML을 관계형 데이터로 변환합니다. 다음은 그 예입니다.
;WITH
/* An XML document representing memory buffer contents */
RingBuffer AS
(
SELECT CAST (xst.target_data AS XML) AS TargetData
FROM sys.dm_xe_session_targets AS xst
INNER JOIN sys.dm_xe_sessions AS xs
ON xst.event_session_address = xs.address
WHERE xs.name = N'ring_buffer_lock_acquired'
),
/* A row for each event in the buffer, represented as an XML fragment */
EventNode AS
(
SELECT CAST (NodeData.query('.') AS XML) AS EventInfo
FROM RingBuffer AS rb
CROSS APPLY rb.TargetData.nodes('/RingBufferTarget/event') AS n(NodeData)
)
/* A relational rowset formed by using the XQuery value method */
SELECT EventInfo.value('(event/@timestamp)[1]','datetimeoffset') AS timestamp,
EventInfo.value('(event/@name)[1]','sysname') AS event_name,
EventInfo.value('(event/data/value)[1]','nvarchar(max)') AS sql_batch_text
FROM EventNode
ORDER BY timestamp DESC;
event_stream 대상
event_stream 대상은 C#과 같은 언어로 작성 된 .NET 프로그램에서만 사용할 수 있습니다. 개발자는 네임스페이스의 .NET Framework 클래스를 통해 이벤트 스트림에 Microsoft.SqlServer.XEvents.Linq 액세스할 수 있습니다. 이 대상은 모든 이벤트 세션에 암시적으로 존재합니다. T-SQL을 사용하여 추가할 수 없습니다.
자세한 내용은 sys.fn_MSxe_read_event_stream 참조하세요.
The event data stream was disconnected because there were too many outstanding events. To avoid this error either remove events or actions from your session or add a more restrictive predicate filter to your session. 대상에서 읽을 때 오류 25726(event_stream)이 발생하면, 클라이언트가 데이터를 사용할 수 있는 속도보다 더 빠르게 이벤트 스트림이 데이터로 채워졌다는 의미입니다. 이로 인해 데이터베이스 엔진은 데이터베이스 엔진 성능에 영향을 주지 않도록 이벤트 스트림에서 연결을 끊습니다.
히스토그램 대상
대상은 histogram 필드 또는 작업의 고유 값에 대한 이벤트 발생 횟수를 계산합니다. 각 고유 값에 대해 별도의 개수 버킷이 사용됩니다.
histogram 대상은 수신한 데이터를 동기적으로 처리합니다.
매개 변수는 SOURCE_TYPE 대상의 동작을 제어합니다.histogram
-
SOURCE_TYPE = 0: 이벤트 필드에 대한 데이터를 수집합니다. -
SOURCE_TYPE = 1: 작업에 대한 데이터를 수집합니다. 기본값입니다.
매개 변수의 SLOTS 기본값은 256입니다. 다른 값을 할당하면 해당 값이 2의 다음 거듭제곱 값으로 반올림됩니다. 예를 들어 SLOTS = 59 64로 반올림됩니다. 대상에 대한 histogram 히스토그램 슬롯의 최대 수는 16,384개입니다.
histogram을 대상으로 사용할 때 때때로 예기치 않은 결과가 나타날 수 있습니다. 일부 이벤트가 예상한 슬롯에 표시되지 않을 수 있고, 다른 슬롯이 예상보다 높은 이벤트 수를 표시할 수 있습니다. 이 문제는 슬롯에 이벤트를 할당할 때 해시 충돌이 발생하는 경우에 발생할 수 있습니다. 이 경우는 드물지만 해시 충돌이 발생하면 한 슬롯에서 계산되어야 할 이벤트가 다른 슬롯에서 계산됩니다. 따라서 특정 슬롯의 개수가 0으로 표시된다고 해서 이벤트가 발생하지 않았다고 가정하는 것은 주의해야 합니다.
한 예로 다음 시나리오를 생각해 보겠습니다.
- 대상으로
histogram을(를) 사용하고object_id에 따라 이벤트를 버킷화하여 확장 이벤트 세션을 설정해 저장 프로시저 실행 통계를 수집합니다. - 저장 프로시저
A를 실행합니다. 그런 다음 저장 프로시저B를 실행합니다.
해시 함수가 두 저장 프로시저의 object_id에 대해 동일한 값을 반환하는 경우, 히스토그램은 A이 두 번 실행되는 것을 보여 주지만 B는 나타나지 않습니다.
고유 값 수가 상대적으로 적은 경우 이 문제를 완화하려면 히스토그램 슬롯의 수를 예상 고유 값의 제곱보다 높게 설정합니다. 예를 들어 histogram 대상의 SOURCE가 table_name 이벤트 필드로 설정되어 있고 데이터베이스에 20개의 테이블이 있는 경우 20*20 = 400이 됩니다. 400보다 큰 2의 다음 거듭제곱은 512이며, 이 예제에서 권장되는 슬롯 수입니다.
각 histogram 대상은 단일 원본(이벤트 필드 또는 작업)의 데이터를 허용하며 하나의 히스토그램만 포함합니다. 이벤트 세션당 동일한 형식의 대상을 둘 이상 추가할 수 없습니다. 대상당 histogram 둘 이상의 원본 형식을 가질 수도 없습니다. 따라서 별도의 histogram 대상에서 다른 작업 또는 이벤트 필드를 추적하려면 새 이벤트 세션이 필요합니다.
히스토그램 대상을 사용하여 이벤트 세션 만들기
다음은 histogram 대상을 사용하여 이벤트 세션을 만드는 예제입니다.
Azure SQL Database나 Fabric의 SQL 데이터베이스에서 이 예제를 사용하려면 ON SERVER를 ON DATABASE으로 교체합니다.
CREATE EVENT SESSION histogram_lock_acquired
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
);
절에서 ADD TARGET ... (SET ...) 대상 매개 변수 SOURCE_TYPE은 1로 설정되어 있으며, 이는 histogram 대상이 작업을 추적함을 의미합니다.
ADD EVENT ... (ACTION ...) 절은 이벤트에 sqlos.system_thread_id 작업을 추가합니다. 매개 SOURCE 변수는 이 작업에서 수집한 시스템 스레드 ID를 대상의 데이터 sqlos.system_thread_id 원본으로 사용하도록 설정 histogram 됩니다. 이 예제의 histogram 대상은 lock_acquired 세션이 활성 상태인 동안 잠금을 획득하는 각 시스템 스레드에 대한 이벤트 수를 계산합니다.
이벤트 세션을 시작하려면 다음 문을 실행합니다.
ALTER EVENT SESSION histogram_lock_acquired
ON SERVER
STATE = START;
SSMS에서 수집된 히스토그램 데이터를 보려면 세션 노드를 확장하고 대상을 package0.histogram 선택합니다. 데이터는 2열 표에 표시됩니다. 각 행은 고유 값의 버킷과 발생 횟수를 나타냅니다.
다음은 이 예제에서 대상에 histogram 의해 캡처된 데이터가 표시되는 방식입니다.
value 열의 값은 system_thread_id 값입니다. 예를 들어 시스템 스레드 6540에서 총 236개의 잠금을 획득했습니다.
value count
----- -----
6540 236
9308 91
9668 74
10144 49
5244 44
2396 28
T-SQL을 사용하여 대상에서 데이터를 읽는 histogram 예제는 다음과 같습니다.
WITH histogram_target
AS (SELECT TRY_CAST (st.target_data AS XML) AS target_data
FROM sys.dm_xe_sessions AS s
INNER JOIN sys.dm_xe_session_targets AS st
ON s.address = st.event_session_address
WHERE s.name = 'event-session-name-placeholder'),
histogram
AS (SELECT hb.slot.value('(@count)[1]', 'bigint') AS slot_count,
hb.slot.value('(value/text())[1]', 'nvarchar(max)') AS slot_value
FROM histogram_target AS ht
CROSS APPLY ht.target_data.nodes('/HistogramTarget/Slot') AS hb(slot))
SELECT slot_value,
slot_count
FROM histogram;
event_counter 대상
event_counter 대상은 지정된 각 이벤트의 발생 횟수를 계산합니다.
대상에는 event_counter 매개 변수가 없으며 동기적으로 수신하는 데이터를 처리합니다.
event_counter 타겟으로 이벤트 세션 생성하기
다음은 event_counter 대상을 사용하여 이벤트 세션을 만드는 예제입니다. 세션은 처음 네 checkpoint_begin 개의 이벤트를 계산한 다음 조건자가 대상에 전송되는 이벤트 수를 4개로 제한하기 때문에 계산을 중지합니다. 이 예시의 checkpoint_begin 이벤트는 CHECKPOINT 명령을 실행하여 생성할 수 있습니다.
Azure SQL Database나 Fabric의 SQL 데이터베이스에서 이 예제를 사용하려면 ON SERVER를 ON DATABASE으로 교체합니다.
CREATE EVENT SESSION event_counter_checkpoint_begin
ON SERVER
ADD EVENT sqlserver.checkpoint_begin
(
WHERE package0.counter <= 4
)
ADD TARGET package0.event_counter
WITH
(
MAX_MEMORY = 4096 KB,
MAX_DISPATCH_LATENCY = 3 SECONDS
);
이벤트 세션을 시작하려면 다음 문을 실행합니다.
ALTER EVENT SESSION event_counter_checkpoint_begin
ON SERVER
STATE = START;
SSMS에서 수집된 데이터를 보려면 세션 노드를 확장하고 대상을 package0.event_counter 선택합니다. 데이터는 3열 표에 표시됩니다. 각 행은 발생 횟수가 있는 이벤트를 나타냅니다.
다음은 이 예제에서 대상에 의해 event_counter 캡처된 데이터가 4개의 검사점이 발생한 후 어떻게 표시될 수 있는지입니다.
package_name event_name count
------------ ---------------- -----
sqlserver checkpoint_begin 4
pair_matching 대상
pair_matching 대상을 사용하면 해당하는 종료 이벤트 없이 발생하는 시작 이벤트를 감지할 수 있습니다. 예를 들어 일치하는 lock_acquired 이벤트 없이 lock_released 이벤트를 찾을 수 있는 경우, 이는 장기 실행 트랜잭션이 잠금을 보유하고 있음을 나타낼 수 있습니다.
확장 이벤트는 시작 및 종료 이벤트와 자동으로 일치하지 않습니다. 대신, pair_matching 문에서 CREATE EVENT SESSION 대상 사양에 일치하는 논리를 정의합니다. 시작 및 종료 이벤트가 서로 일치하면 대상은 해당 쌍을 삭제하지만, 일치하지 않는 시작 이벤트는 그대로 유지합니다.
pair_matching을(를) 대상으로 하는 이벤트 세션 만들기
이 예제에서는 명명 T1된 예제 테이블을 만들고, 세 개의 행을 삽입하고, 이 테이블의 object_id 값을 가져옵니다. 간단히 하기 위해 이 예제에서는 데이터베이스에 tempdb 테이블을 만듭니다. 다른 데이터베이스를 사용하는 경우 다음 T-SQL 예제 코드에서 데이터베이스 이름을 조정합니다.
CREATE TABLE T1 (id INT PRIMARY KEY);
INSERT INTO T1 (id)
VALUES (1), (2), (3);
SELECT OBJECT_ID('T1') AS object_id;
-- object_id = 1029578706
다음 이벤트 세션에서는 lock_acquired 및 lock_released 두 개의 이벤트를 수집합니다. 또한 두 개의 대상이 있습니다. 하나는 event_counter 각 이벤트에 대한 발생 횟수를 제공하는 대상입니다. 다른 하나는 pair_matching 시작 lock_acquired 이벤트와 끝 lock_released 이벤트를 쌍으로 일치시키는 논리를 정의하는 대상입니다.
BEGIN_MATCHING_COLUMNS 및 END_MATCHING_COLUMNS에 할당된 쉼표로 구분된 필드의 순서는 동일해야 합니다. 쉼표로 구분된 값에서 언급된 필드 사이에는 탭이나 줄 바꿈이 허용되지 않습니다. 공백은 허용됩니다.
이벤트 세션 정의에서는 이벤트 조건자를 사용하여 해당 이벤트가 테이블tempdb의 개체 ID와 일치하는 데이터베이스 object_id 에서 해당 이벤트 T1 만 수집합니다. 테이블의 개체 ID를 WHERE 사용하도록 절의 조건자를 조정합니다.
Azure SQL Database나 Fabric의 SQL 데이터베이스에서 이 예제를 사용하려면 ON SERVER를 ON DATABASE으로 교체합니다.
CREATE EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
SET COLLECT_DATABASE_NAME = 1,
COLLECT_RESOURCE_DESCRIPTION = 1
ACTION (sqlserver.transaction_id)
WHERE (database_name = 'tempdb'
AND object_id = 1029578706)
),
ADD EVENT sqlserver.lock_released
(
SET COLLECT_DATABASE_NAME = 1,
COLLECT_RESOURCE_DESCRIPTION = 1
ACTION (sqlserver.transaction_id)
WHERE (database_name = 'tempdb'
AND object_id = 1029578706)
)
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
);
이벤트 세션을 시작하려면 다음 문을 실행합니다.
ALTER EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
STATE = START;
T1 테이블을 업데이트하는 트랜잭션을 시작하지만, 이를 커밋하거나 롤백하지 마십시오. 이렇게 하면 잠금이 획득되었지만 해제되지 않습니다.
BEGIN TRANSACTION;
UPDATE T1
SET id = id + 1;
SSMS에서 이벤트 세션의 pair_matching_lock_acquired_released 각 대상에서 출력을 검사합니다.
대상에는 event_counter 다음 출력이 있으며, 하나의 잠금이 해제되지 않은 상태로 유지됨을 보여 줌 그러나 이 대상은 이 잠금에 대한 세부 정보를 표시하지 않습니다.
package_name event_name count
------------ ---------- -----
sqlserver lock_acquired 4
sqlserver lock_released 3
대상에는 pair_matching 간결하게 잘린 다음과 같은 출력이 있습니다. 출력에서 event_counter 나타난 대로, 이벤트에 대한 자세한 내용과 함께 단독 lock_acquired 이벤트에 대한 한 행이 실제로 표시됩니다.
package_name event_name timestamp associated_object_id database_id database_name
------------ ------------ --------- ------------- ----------- -------------
sqlserver lock_acquired 2025-10-01 20:06:07.1890000 1029578706 2 tempdb
트랜잭션을 롤백하십시오.
ROLLBACK;
대상에서 수집한 pair_matching 이벤트에 작업을 추가하면 작업 데이터도 수집됩니다. 예를 들어, sqlserver.sql_text 작업을 사용하여 제공된 T-SQL 텍스트를 이벤트와 함께 포함할 수 있습니다. 이 예제에서는 잠금을 획득한 쿼리를 수집합니다.
etw_classic_sync_target 대상
SQL Server에서 확장 이벤트는 ETW(Windows용 이벤트 추적)와 상호 운용되어 시스템 활동을 모니터링할 수 있습니다. 자세한 내용은 다음을 참조하세요.
이 ETW 대상은 동기적으로 수신하는 데이터를 처리합니다.