-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path46_Extended_Events.sql
More file actions
384 lines (361 loc) · 10.9 KB
/
46_Extended_Events.sql
File metadata and controls
384 lines (361 loc) · 10.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
/**************************************************************
* SQL Server 2022 Extended Events Tutorial
* Description: This script demonstrates how to work with Extended Events
* in SQL Server 2022. It covers:
* - Creating and configuring Extended Events sessions
* - Capturing specific events and event data
* - Working with different event targets
* - Filtering and advanced predicates
* - Analyzing the captured data
* - Real-world monitoring scenarios
* - Performance considerations
**************************************************************/
-------------------------------------------------
-- Region: 1. Introduction and Setup
-------------------------------------------------
USE master;
GO
/*
Clean up any existing Extended Events session with the same name
to avoid errors when running this script multiple times.
*/
IF EXISTS (SELECT * FROM sys.server_event_sessions WHERE name = 'QueryPerformanceMonitoring')
DROP EVENT SESSION QueryPerformanceMonitoring ON SERVER;
GO
-------------------------------------------------
-- Region: 2. Creating a Basic Extended Events Session
-------------------------------------------------
/*
Create a simple Extended Events session to capture SQL statements.
This session captures completed SQL statements with their duration,
CPU usage, and I/O statistics.
*/
CREATE EVENT SESSION BasicQueryCapture ON SERVER
ADD EVENT sqlserver.sql_statement_completed
(
ACTION
(
sqlserver.sql_text,
sqlserver.database_name,
sqlserver.client_hostname,
sqlserver.client_app_name,
sqlserver.username
)
WHERE duration > 1000000 -- 1 second in microseconds
)
ADD TARGET package0.event_file
(
SET filename = N'E:\ExtendedEvents\BasicQueryCapture.xel',
max_file_size = 10, -- 10 MB
max_rollover_files = 5
);
GO
/*
Start the Extended Events session.
*/
ALTER EVENT SESSION BasicQueryCapture ON SERVER STATE = START;
GO
-------------------------------------------------
-- Region: 3. Creating an Advanced Monitoring Session
-------------------------------------------------
/*
Create a more comprehensive session for performance monitoring.
This captures query timeouts, deadlocks, and long-running queries.
*/
CREATE EVENT SESSION QueryPerformanceMonitoring ON SERVER
ADD EVENT sqlserver.sql_statement_completed
(
ACTION
(
sqlserver.sql_text,
sqlserver.database_name,
sqlserver.client_hostname,
sqlserver.username,
sqlserver.query_hash,
sqlserver.query_plan_hash,
sqlserver.session_id
)
WHERE duration > 5000000 -- 5 seconds in microseconds
),
ADD EVENT sqlserver.rpc_completed
(
ACTION
(
sqlserver.sql_text,
sqlserver.database_name,
sqlserver.client_hostname,
sqlserver.username,
sqlserver.query_hash,
sqlserver.query_plan_hash,
sqlserver.session_id
)
WHERE duration > 5000000 -- 5 seconds in microseconds
),
ADD EVENT sqlserver.lock_timeout
(
ACTION
(
sqlserver.sql_text,
sqlserver.database_name,
sqlserver.client_hostname,
sqlserver.username,
sqlserver.session_id
)
),
ADD EVENT sqlserver.xml_deadlock_report
(
ACTION
(
sqlserver.database_name,
sqlserver.client_hostname,
sqlserver.username,
sqlserver.session_id
)
)
ADD TARGET package0.event_file
(
SET filename = N'E:\ExtendedEvents\QueryPerformanceMonitoring.xel',
max_file_size = 50, -- 50 MB
max_rollover_files = 10
),
ADD TARGET package0.ring_buffer
(
SET max_memory = 4096 -- 4 MB
);
GO
/*
Start the Extended Events session.
*/
ALTER EVENT SESSION QueryPerformanceMonitoring ON SERVER STATE = START;
GO
-------------------------------------------------
-- Region: 4. Creating a Session with Advanced Filtering
-------------------------------------------------
/*
Create a session with complex filtering conditions.
This demonstrates the power of Extended Events predicates.
*/
CREATE EVENT SESSION AdvancedFiltering ON SERVER
ADD EVENT sqlserver.sql_statement_completed
(
ACTION
(
sqlserver.sql_text,
sqlserver.database_name,
sqlserver.client_hostname,
sqlserver.username,
sqlserver.query_hash
)
WHERE
-- Filter by database
(sqlserver.database_name = N'QueryStoreDemo')
-- And either long duration or high CPU
AND
(
duration > 1000000 -- 1 second
OR cpu_time > 500000 -- 0.5 seconds
)
-- And not from maintenance jobs
AND sqlserver.client_app_name <> N'SQLServerAgent'
)
ADD TARGET package0.event_file
(
SET filename = N'E:\ExtendedEvents\AdvancedFiltering.xel'
);
GO
/*
Start the Extended Events session.
*/
ALTER EVENT SESSION AdvancedFiltering ON SERVER STATE = START;
GO
-------------------------------------------------
-- Region: 5. Using the Histogram Target
-------------------------------------------------
/*
Create a session using the histogram target to aggregate event data.
This is useful for identifying patterns without collecting large amounts of data.
*/
CREATE EVENT SESSION QueryHistogram ON SERVER
ADD EVENT sqlserver.sql_statement_completed
(
ACTION
(
sqlserver.database_name,
sqlserver.client_hostname,
sqlserver.query_hash
)
WHERE duration > 100000 -- 0.1 seconds
)
ADD TARGET package0.histogram
(
SET
-- Group by query_hash
slots = 64,
filtering_event_name = 'sqlserver.sql_statement_completed',
source_type = 1, -- Action
source = 'sqlserver.query_hash'
);
GO
/*
Start the Extended Events session.
*/
ALTER EVENT SESSION QueryHistogram ON SERVER STATE = START;
GO
-------------------------------------------------
-- Region: 6. Querying Extended Events Data
-------------------------------------------------
/*
Query the ring buffer target to see live data without reading XEL files.
*/
SELECT
event_data.value('(event/@name)[1]', 'varchar(50)') AS event_name,
event_data.value('(event/@timestamp)[1]', 'datetime2') AS event_timestamp,
event_data.value('(event/action[@name="sql_text"]/value)[1]', 'nvarchar(max)') AS sql_text,
event_data.value('(event/action[@name="database_name"]/value)[1]', 'nvarchar(128)') AS database_name,
event_data.value('(event/action[@name="username"]/value)[1]', 'nvarchar(128)') AS username,
event_data.value('(event/data[@name="duration"]/value)[1]', 'bigint') / 1000.0 AS duration_ms
FROM
(
SELECT CAST(target_data AS XML) AS target_data
FROM sys.dm_xe_session_targets st
JOIN sys.dm_xe_sessions s ON s.address = st.event_session_address
WHERE s.name = 'QueryPerformanceMonitoring'
AND st.target_name = 'ring_buffer'
) AS data
CROSS APPLY target_data.nodes('RingBufferTarget/event') AS events(event_data)
ORDER BY event_timestamp DESC;
GO
/*
Query the histogram target to see aggregated data.
*/
SELECT
n.value('(@count)[1]', 'bigint') AS event_count,
n.value('(value)[1]', 'nvarchar(4000)') AS query_hash
FROM
(
SELECT CAST(target_data AS XML) AS target_data
FROM sys.dm_xe_session_targets st
JOIN sys.dm_xe_sessions s ON s.address = st.event_session_address
WHERE s.name = 'QueryHistogram'
AND st.target_name = 'histogram'
) AS data
CROSS APPLY target_data.nodes('HistogramTarget/Slot') AS slots(n)
ORDER BY event_count DESC;
GO
-------------------------------------------------
-- Region: 7. Reading From XEL Files
-------------------------------------------------
/*
Create a query to read data from XEL files using sys.fn_xe_file_target_read_file.
This is useful for analyzing data after it's been collected.
*/
-- Query data from XEL files (adjust the file path as needed)
SELECT
event_data.value('(event/@name)[1]', 'varchar(50)') AS event_name,
event_data.value('(event/@timestamp)[1]', 'datetime2') AS event_timestamp,
event_data.value('(event/action[@name="sql_text"]/value)[1]', 'nvarchar(max)') AS sql_text,
event_data.value('(event/action[@name="database_name"]/value)[1]', 'nvarchar(128)') AS database_name,
event_data.value('(event/data[@name="duration"]/value)[1]', 'bigint') / 1000.0 AS duration_ms,
event_data.value('(event/data[@name="cpu_time"]/value)[1]', 'bigint') / 1000.0 AS cpu_time_ms,
event_data.value('(event/data[@name="logical_reads"]/value)[1]', 'bigint') AS logical_reads
FROM
(
SELECT CAST(event_data AS XML) AS event_data
FROM sys.fn_xe_file_target_read_file
(
'E:\ExtendedEvents\BasicQueryCapture*.xel',
NULL,
NULL,
NULL
)
) AS raw_data
ORDER BY event_timestamp DESC;
GO
-------------------------------------------------
-- Region: 8. Blocking and Wait Statistics Monitoring
-------------------------------------------------
/*
Create a session to monitor blocking and wait statistics.
This helps identify performance bottlenecks in the system.
*/
CREATE EVENT SESSION BlockingMonitoring ON SERVER
ADD EVENT sqlserver.blocked_process_report
(
ACTION
(
sqlserver.sql_text,
sqlserver.database_name,
sqlserver.client_hostname,
sqlserver.username
)
),
ADD EVENT sqlos.wait_info
(
ACTION
(
sqlserver.sql_text,
sqlserver.session_id,
sqlserver.database_name
)
WHERE
-- Filter common benign waits
opcode = 1 -- End of wait
AND duration > 500000 -- 0.5 seconds
AND wait_type NOT IN (0, 1, 2, 3, 6) -- Exclude QDS, BROKER, etc.
)
ADD TARGET package0.event_file
(
SET filename = N'E:\ExtendedEvents\BlockingMonitoring.xel',
max_file_size = 20,
max_rollover_files = 5
);
GO
/*
Configure the blocked process threshold (in seconds)
*/
EXEC sp_configure 'blocked process threshold (s)', 10;
GO
RECONFIGURE;
GO
/*
Start the Extended Events session.
*/
ALTER EVENT SESSION BlockingMonitoring ON SERVER STATE = START;
GO
-------------------------------------------------
-- Region: 9. Cleanup
-------------------------------------------------
/*
Stop and drop all Extended Events sessions created in this script.
*/
-- Uncomment the following lines to clean up all sessions
/*
ALTER EVENT SESSION BasicQueryCapture ON SERVER STATE = STOP;
GO
DROP EVENT SESSION BasicQueryCapture ON SERVER;
GO
ALTER EVENT SESSION QueryPerformanceMonitoring ON SERVER STATE = STOP;
GO
DROP EVENT SESSION QueryPerformanceMonitoring ON SERVER;
GO
ALTER EVENT SESSION AdvancedFiltering ON SERVER STATE = STOP;
GO
DROP EVENT SESSION AdvancedFiltering ON SERVER;
GO
ALTER EVENT SESSION QueryHistogram ON SERVER STATE = STOP;
GO
DROP EVENT SESSION QueryHistogram ON SERVER;
GO
ALTER EVENT SESSION BlockingMonitoring ON SERVER STATE = STOP;
GO
DROP EVENT SESSION BlockingMonitoring ON SERVER;
GO
-- Reset blocked process threshold
EXEC sp_configure 'blocked process threshold (s)', 0;
GO
RECONFIGURE;
GO
*/
-------------------------------------------------
-- End of Script
-------------------------------------------------