【问题标题】:Count number of times a procedure is executed计算过程执行的次数
【发布时间】:2026-01-25 08:35:01
【问题描述】:

要求:

计算程序执行的次数

据我目前了解,sys.dm_exec_procedure_stats 可用于近似计数,但这只是自上次服务重启以来。我发现此 link on this website 相关,但我需要准确计数,并且在服务重启后不应冲掉。

请给我一些建议好吗?

Hack:我需要跟踪的过程有一个 select 语句,因此会返回一些存储在名为 Results 的永久表中的行。我能想到的最简单的解决方案是在Results 表中创建一个列来跟踪过程执行,在插入之前从该列中选择最大值,然后将其加一以增加计数。这个解决方案对我来说似乎也很愚蠢,但我能想到的最好的解决方案。

【问题讨论】:

  • 可以修改 SProc 吗?
  • @Richard:是的,我可以。
  • 当计划从缓存中删除时,dm_exec_procedure_stats 中的数据消失得更快。
  • 在过程中创建一个序列并从中获取值?
  • @JamesZ:那么,有哪些方法可以准确地永久跟踪程序执行次数?

标签: sql-server stored-procedures ssms


【解决方案1】:

我认为你可以创建一个序列对象,假设你使用的是 SQL Server 2012 或更高版本。

CREATE SEQUENCE ProcXXXCounter
    AS int
    START WITH 1
    INCREMENT BY 1 ;

然后在过程中从中获取一个值:

declare @CallCount int

select @CallCount = NEXT VALUE FOR ProcXXXCounter

这当然会有一点开销,但不会导致使用表时可能发生的类似阻塞问题,因为序列是在事务之外处理的。

序列参数:https://msdn.microsoft.com/en-us/library/ff878091.aspx

【讨论】:

  • 仅在 2012 年及以后可用,如果 proc 被回滚,数字将会增加,并会显示错误的执行次数。
  • @JamesZ:非常感谢詹姆斯。这实际上看起来像我想要的。非常感谢。
【解决方案2】:

我能想到的唯一方法是在服务重新启动时跟踪执行次数,即在您的数据库中拥有一个表,并在每次执行时在您的过程中向该表中插入一行。

也许还可以添加一个日期时间列来收集有关执行的更多信息。以及执行用户的列等。

【讨论】:

  • 谢谢。是的,我上面提到的那种 hack 有点相同,但实际上期待一种更简洁的方法:)
  • 对我来说它看起来很整洁 :) 不要认为你有很多选择可以满足你的要求 :)
【解决方案3】:

这可以通过使用扩展事件轻松完成,无需企业版。 sqlserver.module_end 事件将触发,正确设置谓词并使用直方图目标。

http://sqlperformance.com/2014/06/extended-events/predicate-order-matters https://technet.microsoft.com/en-us/library/ff878023(v=sql.110).aspx

要使用该值,请查询直方图目标(在审查目标输出示例下)。

【讨论】:

  • 感谢您的贡献。 :) 这看起来很有趣,但我是个新手。对不起,我是个菜鸟,但我可以先找一个更基本的帖子吗?谢谢。