SQL Server 2008 R2에서 확장 이벤트 세션을 만들었습니다. 세션은 실행되고 예상대로 정확하게 이벤트가 발생하는대로 수집합니다.
이벤트가 비교적 적을 때 XML을 파쇄하면 성능이 허용됩니다. 수천 개의 이벤트가 발생하면 xml을 파쇄하는 데 시간이 오래 걸립니다.
나는 내가 잘못하고 있다는 것을 알고 있습니다. XML 엔진의 내부에 대한 지식이 충분하지 않아서 무엇을 이해할 수 없습니다.
이것이 내 확장 이벤트 세션의 정의입니다.
IF EXISTS
(
SELECT 1
FROM sys.server_event_sessions dxs
WHERE dxs.name = 'queries'
)
BEGIN
IF EXISTS (
SELECT 1
FROM sys.dm_xe_sessions dxs
WHERE dxs.name = 'queries'
)
BEGIN
ALTER EVENT SESSION queries ON SERVER STATE = STOP;
END
DROP EVENT SESSION queries ON SERVER;
END
CREATE EVENT SESSION queries ON SERVER
ADD EVENT sqlserver.sql_statement_starting
(
ACTION
(
package0.collect_system_time
--, package0.event_sequence
, sqlserver.client_app_name
, sqlserver.client_hostname
--, sqlserver.database_name
, sqlserver.plan_handle
, sqlserver.sql_text
, sqlserver.username
)
WHERE sqlserver.username = N'<some username>'
AND sqlserver.database_id = 6 /* specific database */
AND sqlserver.client_hostname <> '<my machine>'
)
, ADD EVENT sqlserver.error_reported
(
ACTION
(
package0.collect_system_time
, sqlserver.client_app_name
, sqlserver.client_hostname
, sqlserver.plan_handle
, sqlserver.sql_text
, sqlserver.username
)
WHERE sqlserver.username <> N'<some username>'
/* fluff errors below */
AND error <> 5703 /* Changed language setting to %.*ls. */
AND error <> 5701 /* Changed database context to '%.*ls'. */
AND error <> 2528 /* DBCC execution completed. If DBCC printed error messages, contact your system administrator. */
AND error <> 7969 /* No active open transactions. */
--AND error <> 14205/* (unknown) */
AND error <> 4035 /* Processed %I64d pages for database '%ls', file '%ls' on file %d. */
AND error <> 18265/* Log was backed up. Database: %s, creation date(time): %s(%s), first LSN: %s, last LSN: %s, number of dump devices: %d, device information: (%s). This is an informational message only. No user action is required. */
AND error <> 3014 /* %hs successfully processed %I64d pages in %d.%03d seconds (%d.%03d MB/sec). */
AND error <> 14570/* (Job outcome) */
AND error <> 8153 /* Warning: Null value is eliminated by an aggregate or other SET operation. */
)
ADD TARGET package0.ring_buffer
(
SET max_memory = 102400
)
WITH
(
STARTUP_STATE=OFF
, TRACK_CAUSALITY = ON
);
GO
IF EXISTS
(
SELECT 1
FROM sys.server_event_sessions dxs
WHERE dxs.name = 'queries'
)
BEGIN
ALTER EVENT SESSION queries ON SERVER STATE = START;
END
이것이 내가 결과를 파쇄하는 방법입니다.
/***************************
shred the Event Data into readable form
***************************/
DECLARE @xml XML;
SELECT TOP(1) @xml = CONVERT(xml, xet.target_data)
FROM sys.dm_xe_session_targets AS xet
INNER JOIN sys.dm_xe_sessions AS xe ON (xe.address = xet.event_session_address)
WHERE xe.name = 'queries';
SELECT t.EventName
, DateStamp = DATEADD(HOUR, -6, t.EventDateStamp)
, DatabaseName = d.name
, t.ErrorNumber
, t.ErrorSeverity
, t.ErrorState
, t.ErrorMessage
, t.CollectSystemTime
, t.ClientAppName
, t.ClientHostName
, t.PlanHandle
, t.SqlText
, t.UserName
FROM (
SELECT EventName = s.value('(@name)[1]','varchar(500)')
, EventDateStamp = s.value('(@timestamp)[1]','datetime')
, DatabaseID = s.value('(data[(@name)[1] eq "source_database_id"]/value/text())[1]','varchar(255)')
, ErrorNumber = s.value('(data[(@name)[1] eq "error"]/value/text())[1]','int')
, ErrorSeverity = s.value('(data[(@name)[1] eq "severity"]/value/text())[1]','int')
, ErrorState = s.value('(data[(@name)[1] eq "state"]/value/text())[1]','int')
, ErrorMessage = s.value('(data[(@name)[1] eq "message"]/value/text())[1]','varchar(255)')
, CollectSystemTime = s.value('(action[(@name)[1] eq "collect_system_time"]/text/text())[1]','varchar(255)')
, ClientAppName = s.value('(action[(@name)[1] eq "client_app_name"]/value/text())[1]','varchar(255)')
, ClientHostName = s.value('(action[(@name)[1] eq "client_hostname"]/value/text())[1]','varchar(255)')
, PlanHandle = CONVERT(xml, s.value('(action[(@name)[1] eq "plan_handle"]/value/text())[1]','varchar(255)')).value('(plan/@handle)[1]', 'varchar(255)')
, SqlText = s.value('(action[(@name)[1] eq "sql_text"]/value/text())[1]','nvarchar(max)')
, UserName = s.value('(action[(@name)[1] eq "username"]/value/text())[1]','varchar(128)')
FROM @xml.nodes('/RingBufferTarget/event') AS xm(s)
) t
LEFT JOIN sys.databases d ON t.DatabaseID = d.database_id
ORDER BY t.UserName
, t.EventDateStamp;
2
최신 버전 인 경우에도 이것을 보셨습니까 ?
—
Tom V-topanswers.xyz
나는 그것이 당신에게 도움이되지 않는다는 것을 알고 있지만, XML 견해는 비싼 코어 라이센스를 사용하는 가장 최악의 방법입니다. PowerShell을 사용하여 외부에서 파쇄하는 것이 가능합니까?
—
spaghettidba
빠른 시점 : IBM의 DB2.는 XML을 BLOB (텍스트), 관계형 테이블로 파쇄 또는 완전 최적화 된 네이티브 XML 데이터 모델로 직접 지원합니다. (최근에 PureXML 지원을 추가했을 때, 최종적으로 이름을 DB3로 변경하는 데 매우 가까워졌으며, 이는 주요한 발전으로 간주되었습니다.)-주장자 : PureXML의 디자인에 영향을 미쳤습니다. , 나는 그 프로젝트에서 일하지 않았지만 여전히 IBM과 함께 있습니다.
—
keshlam
@MaxVernon-그리고 관련해서
—
Martin Smith
OPTION (Optimize FOR (@xml = Null))
도 OPTION (QUERYTRACEON 4130
stackoverflow.com/a/3979266/73226