메모리에서 ring_buffer 대상을 사용하여 이벤트 세션 만들기

적용 대상:Azure SQL DatabaseAzure SQL Managed Instance

이 연습의 개략적인 단계는 다음과 같습니다.

  1. ring_buffer 대상을 사용하여 이벤트 세션 만들기 및 시작
  2. 캡처된 이벤트 데이터를 XML로 보기
  3. 캡처된 이벤트 데이터를 관계형 행 집합으로 보기

ring_buffer 대상을 사용하면 Azure Storage에 이벤트 데이터를 저장할 필요가 없으므로 event_file 대상보다 단계가 더 간단합니다.

ring_buffer 대상을 사용하여 이벤트 세션 만들기 및 시작

SQL Server Management Studio(SSMS)에서 새 이벤트 세션을 생성하려면 확장 이벤트 노드를 확장합니다. 이 노드는 Azure SQL Database의 데이터베이스 폴더 아래, 그리고 Azure SQL Managed Instance의 관리 폴더 아래에 있습니다. 세션 폴더를 마우스 오른쪽 단추로 클릭하고 새 세션...을 선택합니다. 일반 페이지에서 세션의 이름을 입력합니다(이 예제의 경우 example-session). 이벤트 페이지에서 세션에 추가할 하나 이상의 이벤트를 선택합니다. 이 예제에서는 sql_batch_starting 이벤트를 선택했습니다.

Screenshot of the New Session SSMS dialog showing the event selection page with the sql_batch_starting event selected.

데이터 스토리지 페이지에서 대상 유형으로 ring_buffer를 선택합니다. 메모리를 절약하려면 이벤트 수를 작은 수(기본값으로 1,000개)로 유지하고 최대 버퍼 메모리를 1MB 이하로 설정하는 것이 좋습니다. 자세한 내용은 ring_buffer 대상을 참조하세요.

Screenshot of the New Session SSMS dialog showing the data storage selection page with a ring_buffer target selected.

세션이 구성되었으므로 필요에 따라 스크립트 버튼을 선택하여 세션의 T-SQL 스크립트를 생성하고 나중에 사용하도록 저장할 수 있습니다. 다음은 예제 세션에 대한 스크립트입니다.

CREATE EVENT SESSION [example-session] ON DATABASE
ADD EVENT sqlserver.sql_batch_starting
ADD TARGET package0.ring_buffer(SET max_memory=(1024))
GO

확인을 선택하여 세션을 생성합니다.

세션 데이터를 XML로 보기

개체 탐색기에서 세션 폴더를 확장하여 생성한 이벤트 세션을 확인합니다. 기본값으로 세션은 생성될 때 시작되지 않습니다. 세션을 시작하려면 세션 이름을 마우스 오른쪽 단추로 클릭하고 세션 시작을 선택합니다. 세션이 실행되면 세션 중지를 선택하여 나중에 중지할 수 있습니다.

T-SQL 일괄 처리가 이 데이터베이스 또는 관리형 인스턴스에서 실행되면 세션은 메모리 버퍼에 이벤트를 씁니다. 메모리 버퍼의 크기는 유한하므로 모든 메모리가 사용되면 이전 이벤트를 버려 새 이벤트를 위한 공간을 확보합니다.

개체 탐색기에서 세션을 확장하여 package0.ring_buffer 대상을 확인하고 대상을 두 번 클릭합니다. 마우스 오른쪽 단추를 클릭하고 대상 데이터 보기...를 선택할 수도 있습니다. 그러면 XML 조각이 표시된 그리드가 열립니다. 메모리 버퍼 콘텐츠를 나타내는 XML 문서를 보려면 이 XML 조각을 선택합니다.

XML 문서의 첫 번째 줄은 세션 및 대상 메타데이터를 설명합니다.

<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="17" eventCount="17" droppedCount="0" memoryUsed="32070">

이 예제에서는 17개의 이벤트가 ring_buffer 대상에 의해 처리됩니다. 버퍼 메모리가 소진되지 않았고 구성한 최대 이벤트 수(1,000개)에 도달하지 않았기 때문에 이벤트가 삭제되지 않았습니다.

truncated 특성에 주의하세요. 이 특성이 1로 설정된 경우 메모리 버퍼의 XML 표현이 전체 버퍼 콘텐츠를 표시하지 않음을 의미합니다. 자세한 내용은 ring_buffer 대상을 참조하세요.

XML 문서의 나머지 부분에는 이벤트가 포함됩니다. XML에서 단일 이벤트의 표현은 다음과 같을 수 있습니다.

  <event name="sql_batch_starting" package="sqlserver" timestamp="2023-10-18T17:43:34.079Z">
    <data name="batch_text">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[SELECT
'DatabaseXEStore[@Name=' + quotename(CAST(db_name() AS sysname),'''') +' and @ServerName=' + quotename(CAST(SERVERPROPERTY('servername') AS sysname),'''') + ']' AS [Urn],
CAST(db_name() AS sysname) AS [Name],
CAST(SERVERPROPERTY('servername') AS sysname) AS [ServerName],
(SELECT count(*) FROM sys.dm_xe_database_sessions) AS [RunningSessionCount]]]></value>
    </data>
  </event>

여기서 value 특성에는 T-SQL 일괄 처리(이 예제에서 단일 쿼리)가 포함됩니다.

세션 데이터를 관계형 행 집합으로 보기

관계형 행 집합의 ring_buffer 대상에서 이벤트 데이터를 보려면 XQuery 식을 사용하여 XML을 관계형 데이터로 변환하는 T-SQL 쿼리를 작성해야 합니다.

다음은 미리 생성한 세션 예제로, 최신 이벤트를 먼저 표시합니다.

WITH
/* An XML document representing memory buffer contents */
RingBuffer AS
(
SELECT CAST(xst.target_data AS xml) AS TargetData
FROM sys.dm_xe_database_session_targets AS xst
INNER JOIN sys.dm_xe_database_sessions AS xs
ON xst.event_session_address = xs.address
WHERE xs.name = N'example-session'
),
/* 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;