我创建了一个扩展事件会话,它监视 module_start 事件类型并根据 object_name 进行过滤:equal_i_sql_unicode_string]([object_name])
本次会议的目的是在调用过滤器列表中的 proc 时简单地记录基本信息,以便我可以以 99.9% 的保证在生产中是否仍然调用 proc 来回答开发人员的问题。这个想法是 24/7 运行约 1 个月(是的,它不考虑每年运行的东西,但它就是这样)。
我遇到的问题是开发人员给我的 procs 列表大约有 90 个左右,EE 会话的过滤器列表限制为 3,000 个字符。为了提高我们可以跟踪 procs 的速率,我想出的唯一想法是拥有 2 个独立的 EE 会话,它们是相同的,只是过滤器谓词不同。
我不是在问“这会对 CPU 产生多大的影响”,而是他们或多或少地担心使用不同的过滤谓词运行 2 个相同的 EE 会话?对我来说奇怪的是,当“更多过滤 == 更好的性能”时,Microsoft 会将过滤器列表限制为 3,000 个字符,因为 EE 内置到引擎中的方式非常优化,不像跟踪更像代理而不是“触发器”基于一个事件”。
是否可以安全地假设无论运行 1 个会话对性能的影响是什么,我都可以将其乘以 2,还是我没有考虑他们进一步的担忧?
无论如何,我都不是扩展事件方面的专家,但我知道如果不小心操作,可能会对性能产生影响。如果对您当前的服务器/数据库的工作负载有任何有意义的影响,您只能通过全天的测试和监控来发现。我认为通过将其过滤到甚至不一定被使用的特定实体可能是可以的。
另一种想法是修改每个存储过程,以便将过程名称和当前日期时间插入表中。
对于其他一些替代解决方案,您可以查看此 StackOverflow 帖子的答案。不过,如果您走那条路线,我会小心使用
sys.dm_exec_procedure_stats
,因为如果事件已清除计划缓存,则不能 100% 保证为您提供所需的结果。