如何检查哪个存储过程在sql server中占用了最多时间

Sha*_*pta 12 sql-server optimization performance

我想知道什么是各种方法,通过它我可以监视哪些存储过程和SQL查询在各种组件(CPU周期,扫描时间等)上花费的时间比已设置的阈值多.

我希望它也被记录下来.每当任何用户使用我的网站并调用某个程序时,我想记录超过我的阈值的所有程序.

是否可以使用SQL查询或过程来执行此操作.我们有一些程序吗?任何SQL工具或任何外部工具都可以支付(试用)或免费.我想在我的数据库上尝试它们.

Jus*_*tin 13

您应该能够使用动态管理视图(DMV)执行此操作,特别是您可能对exec_query_stats视图最感兴趣,该视图维护所有查询(CPU时间,物理/逻辑读取等等)的执行统计信息.执行计划.

另请参阅这篇优秀文章,其中包含查看计划统计信息的示例查询,并详细介绍了该主题:

最后,如果要跟踪/记录过长的运行查询,那么您可能需要考虑让SQL Server Profiler跟踪始终运行,并将执行时的过滤器设置为某个高数字(例如> 1000 ms).您可以使用SQL Server Profiler窗口应用程序,也可以使用T-SQL创建跟踪,而不是将其记录到数据库中的表中:

这样做的好处是可以准确地告诉您查询究竟花了多长时间,何时以及该查询的参数是什么(神圣的SQL蝙蝠侠!)

在加载的数据库上运行此跟踪的性能影响实际上非常小 - 我知道令人惊讶的批评应用程序,这些跟踪作为例行程序运行,以便能够快速诊断性能问题(并且它确实有很大帮助) .关键在于选择一个"大"的执行时间,这个时间足够大,不会淹没日志,但又要小到足以获得足够长时间运行的查询才有用.

过去在遇到性能问题时使用的另一个技巧是在加载的SQL服务器上保持一段未经过滤的SQL服务器跟踪在短时间内(大约1分钟)运行(它确实产生了惊人的影响,你只是淹没日志)

我也衷心地推荐关于这个主题的Microsoft SQL Server内部书籍 - 它非常技术性,但它很棒,因为它不仅包括这些类型的诊断工具,还包括它们实际意味着什么