You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不修改存储过程代码的情况下统计CLR函数的调用次数?

查看存储过程单次执行中CLR函数的调用次数

原查询使用的sys.dm_exec_function_stats仅统计T-SQL函数的执行情况,不包含CLR函数,所以无法获取CLR函数的调用数据。以下是两种可行的解决方案:

方法一:用扩展事件跟踪(推荐,低开销)

扩展事件是SQL Server轻量级的跟踪工具,适合捕获单次执行期间的CLR函数调用:

  1. 创建并启动扩展事件会话,指定跟踪目标和筛选条件
-- 创建扩展事件会话
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
  1. 执行目标存储过程
EXEC 你的存储过程名;
  1. 停止会话并查询调用次数
-- 停止会话
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
  1. 清理会话(可选)
DROP EVENT SESSION [TrackCLRFunctionCalls] ON SERVER;

方法二:使用SQL Server Profiler(测试环境可用)

虽然微软已不推荐使用Profiler(开销较高),但在测试环境中可以快速实现:

  • 新建跟踪,选择"CLR"事件组下的"CLR Function Starting"事件
  • 添加筛选条件,指定存储过程名称或当前会话ID
  • 启动跟踪后执行存储过程,停止跟踪后统计事件数量即可

内容的提问来源于stack exchange,提问作者Yagi Gogi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 10:50:06