如何在不修改存储过程代码的情况下统计CLR函数的调用次数?
查看存储过程单次执行中CLR函数的调用次数
原查询使用的sys.dm_exec_function_stats仅统计T-SQL函数的执行情况,不包含CLR函数,所以无法获取CLR函数的调用数据。以下是两种可行的解决方案:
方法一:用扩展事件跟踪(推荐,低开销)
扩展事件是SQL Server轻量级的跟踪工具,适合捕获单次执行期间的CLR函数调用:
- 创建并启动扩展事件会话,指定跟踪目标和筛选条件
-- 创建扩展事件会话 CREATE EVENT SESSION [TrackCLRFunctionCalls] ON SERVER ADD EVENT sqlserver.clr_function_start( ACTION(sqlserver.session_id, sqlserver.database_name) -- 先执行SELECT @@SPID获取当前会话ID,替换下方的数值 WHERE sqlserver.session_id = N'你的会话ID') ADD TARGET package0.event_file(SET filename=N'TrackCLRFunctionCalls.xel') WITH (STARTUP_STATE=OFF); GO -- 启动会话 ALTER EVENT SESSION [TrackCLRFunctionCalls] ON SERVER STATE = START; GO
- 执行目标存储过程
EXEC 你的存储过程名;
- 停止会话并查询调用次数
-- 停止会话 ALTER EVENT SESSION [TrackCLRFunctionCalls] ON SERVER STATE = STOP; GO -- 解析捕获的事件,统计CLR函数调用次数 SELECT OBJECT_NAME(calls.object_id, calls.database_id) AS CLR函数名, COUNT(*) AS 调用次数 FROM ( SELECT DB_ID(event_data.value('(event/action[@name="database_name"]/value)[1]', 'varchar(128)')) AS database_id, event_data.value('(event/data[@name="object_id"]/value)[1]', 'int') AS object_id FROM ( SELECT CAST(event_data AS XML) AS event_data FROM sys.fn_xe_file_target_read_file('TrackCLRFunctionCalls*.xel', NULL, NULL, NULL) ) AS x ) AS calls GROUP BY database_id, object_id ORDER BY 调用次数 DESC; GO
- 清理会话(可选)
DROP EVENT SESSION [TrackCLRFunctionCalls] ON SERVER;
方法二:使用SQL Server Profiler(测试环境可用)
虽然微软已不推荐使用Profiler(开销较高),但在测试环境中可以快速实现:
- 新建跟踪,选择"CLR"事件组下的"CLR Function Starting"事件
- 添加筛选条件,指定存储过程名称或当前会话ID
- 启动跟踪后执行存储过程,停止跟踪后统计事件数量即可
内容的提问来源于stack exchange,提问作者Yagi Gogi
相关产品推荐
相关产品推荐

