আমি এসকিউএল সার্ভার 2008 আর 2 এ একটি বর্ধিত ইভেন্টস সেশন তৈরি করেছি। সেশনটি চলে এবং ইভেন্টগুলি যেমন ঘটেছিল ঠিক তেমন সংগ্রহ করে যেমন আপনি প্রত্যাশা করতেন।
তুলনামূলকভাবে কয়েকটি ইভেন্ট থাকলে আমি যদি এক্সএমএলটি ছিটিয়ে থাকি তবে পারফরম্যান্স গ্রহণযোগ্য। আমার যখন কয়েক হাজার ইভেন্ট থাকে, তখন এটি এক্সএমএল ছড়িয়ে দিতে চিরকালের জন্য লাগে।
আমি জানি যে আমি কিছু ভুল করছি, এক্সএমএল ইঞ্জিনের ইন্টার্নালগুলি সম্পর্কে কী বোঝার জন্য আমার কাছে পর্যাপ্ত জ্ঞান নেই।
এটি আমার বর্ধিত ইভেন্টস অধিবেশনটির সংজ্ঞা:
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
আপনি দেখেছেন এমন এই যদিও তা একটি আরো সাম্প্রতিক সংস্করণ জন্য?
—
টম ভী -
আমি জানি যে এটি আপনাকে সাহায্য করবে না, তবে, আমার মতে এক্সএমএল শেডডিং আপনার ব্যয়বহুল মূল লাইসেন্সগুলি ব্যবহারের সবচেয়ে খারাপ উপায়। পাওয়ারশেলের সাথে বাহ্যিকভাবে ছাঁটাই করা কি কোনও সম্ভাবনা?
—
স্প্যাগেটিডবা
সম্পর্কিত dba.stackexchange.com/q/30862/3690
—
মার্টিন স্মিথ
তাত্ক্ষণিকভাবে: আইবিএমের ডিবি 2 ডায়রেক্টলি এক্সএমএলকে বিএলএলবি (টেক্সট) হিসাবে সমর্থন করে, যেমন সম্পর্কিত টেবিলগুলিতে বিচ্ছিন্নভাবে বা সম্পূর্ণ অপ্টিমাইজড নেটিভ-এক্সএমএল ডেটা মডেল হিসাবে। (আমাকে বলা হয়েছে যে তারা যখন শেষটি যুক্ত করেছিল, পিওরএক্সএমএল সমর্থন, তারা অবশেষে নামটি ডিবি 3 এ পরিবর্তনের খুব কাছাকাছি এসেছিল; এটি বড় অগ্রিম হিসাবে বিবেচিত হয়েছিল।) - দাবীদার: পিউরএক্সএমএল এর নকশায় আমার কিছুটা প্রভাব ছিল যদিও আমি সেই প্রকল্পে কাজ করছিলাম না, এবং আমি এখনও আইবিএমের সাথে আছি।
—
কেশলাম
@MaxVernon - আর সংক্রান্ত
—
মার্টিন স্মিথ
OPTION (Optimize FOR (@xml = Null))
আপনার কাছে ব্যবহার করতে পারেন OPTION (QUERYTRACEON 4130
stackoverflow.com/a/3979266/73226