ฉันสร้างเซสชันเพิ่มเติมในเหตุการณ์ใน SQL Server 2008 R2 เซสชั่นจะทำงานและรวบรวมกิจกรรมตามที่เกิดขึ้นเช่นเดียวกับที่คุณคาดหวัง
ถ้าฉันฉีก xml เมื่อมีเหตุการณ์ค่อนข้างน้อยประสิทธิภาพเป็นที่ยอมรับได้ เมื่อฉันมีเหตุการณ์นับพันใช้เวลานานในการฉีก xml
ฉันรู้ว่าฉันกำลังทำสิ่งผิดปกติฉันไม่มีความรู้เพียงพอเกี่ยวกับ internals ของเอ็นจิน 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 shredding เป็นวิธีที่แย่ที่สุดในการใช้ใบอนุญาตหลักที่มีราคาแพง การทำลายเอกสารภายนอกด้วย PowerShell เป็นไปได้หรือไม่
—
spaghettidba
ในฐานะที่เป็นจุดด่วน: DB2.directly ของไอบีเอ็มสนับสนุน XML เป็น BLOBs (ข้อความ) ตามที่หั่นเป็นตารางเชิงสัมพันธ์หรือเป็นโมเดลข้อมูลเนทีฟ XML ที่ได้รับการปรับปรุงให้ดีที่สุด (ฉันบอกว่าเมื่อพวกเขาเพิ่มที่ผ่านมาการสนับสนุน PureXML พวกเขาเข้ามาใกล้ที่สุดในที่สุดก็เปลี่ยนชื่อเป็น DB3 มันก็ถือว่าเป็นความก้าวหน้าครั้งสำคัญ) - ผู้อ้างสิทธิ์: ฉันมีอิทธิพลต่อการออกแบบ PureXML แม้ว่าฉันจะไม่ได้ทำงานในโครงการนั้น แต่ฉันยังอยู่กับ IBM
—
keshlam
@MaxVernon - และ
—
Martin Smith ได้
OPTION (Optimize FOR (@xml = Null))
คุณยังสามารถใช้OPTION (QUERYTRACEON 4130
stackoverflow.com/a/3979266/73226