当前位置:网站首页>实战:sqlserver 2008 扩展事件-XML转换为标准的table格式[通俗易懂]
实战:sqlserver 2008 扩展事件-XML转换为标准的table格式[通俗易懂]
2022-07-07 18:12:00 【全栈程序员站长】
大家好,又见面了,我是全栈君。
--假设已经存在Event Session删除
IF EXISTS (SELECT * FROM sys.server_event_sessions WHERE name='MonitorLongQuery')
DROP EVENT SESSION MonitorLongQuery ON SERVER
GO
--创建Extended Event session
CREATE EVENT SESSION MonitorLongQuery ON SERVER
--添加Event(SQL完毕事件)
ADD EVENT sqlserver.sql_statement_completed
(
--指定收集的Event信息
ACTION
(
sqlserver.database_id,
sqlserver.session_id,
sqlserver.username,
sqlserver.client_hostname,
sqlserver.sql_text,
sqlserver.tsql_stack
)
--Filter信息(CPU超过或者整个执行时间超过10S)
WHERE sqlserver.sql_statement_completed.cpu> 10000
OR sqlserver.sql_statement_completed.duration> 10000
)
--指定收集的Event信息储存位置(能够存储到内存也能够到文件)
ADD TARGET package0.asynchronous_file_target
(
SET FILENAME = N's:\monitor\LogQuery.xet',
METADATAFILE = 'S:\monitor\LongQuery.xem'
)
GO
SELECT sessions.name AS SessionName,sevents.package as PackageName,
sevents.name AS EventName,
sevents.predicate, sactions.name AS ActionName, stargets.name AS TargetName
FROM sys.server_event_sessions sessions
INNER JOIN sys.server_event_session_events sevents
ON sessions.event_session_id= sevents.event_session_id
INNER JOIN sys.server_event_session_actions sactions
ON sessions.event_session_id= sactions.event_session_id
INNER JOIN sys.server_event_session_targets stargets
ON sessions.event_session_id= stargets.event_session_id
WHERE sessions.name='MonitorLongQuery'
GO
--启动Event Session捕获数据
ALTER EVENT SESSION MonitorLongQuery
ON SERVER STATE = START
GO
--查询
SELECT CAST(event_data AS XML) event_data,*
FROM sys.fn_xe_file_target_read_file
('s:\monitor\LogQuery_0_129954478780290000.xet',
's:\monitor\LongQuery_0_129954478780330000.xem',NULL,NULL)
go
-停掉Event Session
ALTER EVENT SESSION MonitorLongQuery
ON SERVER STATE = STOP
GO
--删除Event Session
IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name='MonitorLongQuery')
DROP EVENT SESSION MonitorLongQuery ON SERVER
GO
------------将XML转换为常规的表格式
IF EXISTS ( SELECT *
FROM tempdb.dbo.sysobjects
WHERE id = OBJECT_ID(N'tempdb..#MyData')
AND type = 'U' )
DROP TABLE #MyData
go
CREATE TABLE #MyData
(
database_id INT NOT NULL ,
username NVARCHAR(100) NOT NULL,
client_hostname NVARCHAR(100) NOT NULL,
sql_text NVARCHAR(MAX) NOT NULL ,
cpu INT NOT NULL
)
go
DECLARE @xmlData XML
DECLARE @xmlString NVARCHAR(MAX)
DECLARE @database_id INT
DECLARE @username NVARCHAR(100)
DECLARE @client_hostname NVARCHAR(100)
DECLARE @sql_text NVARCHAR(MAX)
DECLARE @cpu INT
DECLARE myCur CURSOR READ_ONLY
FOR
SELECT TOP 200 event_data --CAST(event_data AS XML)
FROM sys.fn_xe_file_target_read_file
('s:\monitor\LogQuery_0_130638808366940000.xet',
's:\monitor\LongQuery_0_130638808366940000.xem',NULL,NULL)
OPEN myCur
FETCH NEXT FROM myCur INTO @xmlString
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
SET @xmlData = CAST(@xmlString AS XML)
--set @cpu = 0
--获取cpu
SET @cpu = @xmlData.query('//data[@name="cpu"]/value').value('(value)[1]',
'INT')
--获取database_id
SET @database_id = @xmlData.query('//action[@name="database_id"]/value').value('(value)[1]',
'INT')
--获取username
SET @username = @xmlData.query('//action[@name="username"]/value').value('(value)[1]',
'NVARCHAR(100)')
--获取hostname
SET @client_hostname = @xmlData.query('//action[@name="client_hostname"]/value').value('(value)[1]',
'NVARCHAR(100)')
--获取sql_text
SET @sql_text = @xmlData.query('//action[@name="sql_text"]/value').value('(value)[1]',
'NVARCHAR(MAX)')
--開始插入数据
INSERT #MyData
( database_id,
sql_text,
username,
client_hostname,
cpu )
VALUES ( @database_id, -- database_id - int
@sql_text, -- sql_text - nvarchar(max)
@username,
@client_hostname,
@cpu
)
END TRY
BEGIN CATCH
END CATCH
FETCH NEXT FROM myCur INTO @xmlString
END
CLOSE myCur
DEALLOCATE myCur
SELECT b.name,a.username,a.client_hostname,a.sql_text,a.cpu FROM #MyData AS a
inner join sys.databases as b
on a.database_id=b.database_id
order by a.cpu desc
go发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116529.html原文链接:https://javaforall.cn
边栏推荐
猜你喜欢

LeetCode_ 7_ five

【mysql篇-基础篇】事务

Cloud component development and upgrading

Leetcode force buckle (Sword finger offer 36-39) 36 Binary search tree and bidirectional linked list 37 Serialize binary tree 38 Arrangement of strings 39 Numbers that appear more than half of the tim

LeetCode力扣(剑指offer 36-39)36. 二叉搜索树与双向链表37. 序列化二叉树38. 字符串的排列39. 数组中出现次数超过一半的数字

Mrs offline data analysis: process OBS data through Flink job

Force buckle 2319 Judge whether the matrix is an X matrix

Sword finger offer II 013 Sum of two-dimensional submatrix

openEuler 有奖捉虫活动,来参与一下?

Splicing and splitting of integer ints
随机推荐
Leetcode force buckle (Sword finger offer 36-39) 36 Binary search tree and bidirectional linked list 37 Serialize binary tree 38 Arrangement of strings 39 Numbers that appear more than half of the tim
One click deployment of any version of redis
YoloV6:YoloV6+Win10---训练自己得数据集
LeetCode_ 7_ five
[résolution] le paquet « xxxx» n'est pas dans goroot
gorilla官方:golang开websocket client的示例代码
CSDN syntax description
大厂经典指针笔试题
JVM GC garbage collection brief
力扣 912.排序数组
MRS离线数据分析:通过Flink作业处理OBS数据
一文读懂数仓中的pg_stat
Opencv learning notes high dynamic range (HDR) imaging
CSDN语法说明
Force buckle 2319 Judge whether the matrix is an X matrix
831. KMP string
模拟实现string类
数据孤岛是企业数字化转型遇到的第一道险关
Force buckle 1037 Effective boomerang
Force buckle 912 Sort array