Sql 执行最频繁的存储过程?

Sql 执行最频繁的存储过程?,sql,sql-server,database,tsql,stored-procedures,Sql,Sql Server,Database,Tsql,Stored Procedures,我们在应用程序中创建了太多低效的存储过程,我们总是推迟使其更高效,直到数据库性能出现严重问题 现在,我正在考虑通过最常执行的存储过程逐个修复它 确定哪个存储过程执行得最多的最佳方法是什么 是否有脚本可以显示哪个存储过程执行得最多?典型情况 运行性能分析器 然后启动应用程序 设置一些筛选器以捕获大量读取/写入/扫描等操作。使用: SELECT TOP 10 qt.TEXT AS 'SP Name', SUBSTRING(qt.text, qs.statement_st

我们在应用程序中创建了太多低效的存储过程,我们总是推迟使其更高效,直到数据库性能出现严重问题

现在,我正在考虑通过最常执行的存储过程逐个修复它

确定哪个存储过程执行得最多的最佳方法是什么

是否有脚本可以显示哪个存储过程执行得最多?

典型情况

运行性能分析器 然后启动应用程序 设置一些筛选器以捕获大量读取/写入/扫描等操作。

使用:

SELECT TOP 10 
       qt.TEXT AS 'SP Name',
       SUBSTRING(qt.text, qs.statement_start_offset/2, CASE WHEN (qs.statement_end_offset = -1) THEN LEN(qt.text) ELSE (qs.statement_end_offset - qs.statement_start_offset)/2 END) AS actual_query,
       qs.execution_count AS 'Execution Count',
       qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime',
       qs.total_worker_time AS 'TotalWorkerTime',
       qs.total_physical_reads AS 'PhysicalReads',
       qs.creation_time 'CreationTime',
       qs.execution_count/DATEDIFF(Second, qs.creation_time, GETDATE()) AS 'Calls/Second'
  FROM sys.dm_exec_query_stats AS qs
  CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
 WHERE qt.dbid = (SELECT dbid
                    FROM sys.sysdatabases
                   WHERE name = '[your database name]')
ORDER BY qs.total_physical_reads DESC

参考资料:

实现这一点的快速方法是运行SQL Profiler,然后通过TextData对跟踪进行“分组”

  • 进入跟踪属性
  • 在“事件选择”选项卡下,单击 在“组织列”上
  • 单击TextData,并将其上移到 “团体”区域

您可能还只想观看特定事件,如SQL批处理完成。如果我记得的话,这将为您提供持续时间和其他方便的统计数据,以便分组/筛选。

另一个奇妙的工具是Microsoft的性能仪表板


使用SSM可以找到大多数执行的对象<代码>右键单击数据库名称>报告>标准报告>对象执行统计数据。它在下面的GIF图像中有详细说明

您还可以提取子字符串(Text,statement\u start\u offset/2,case when(statement\u end\u offset=-1),然后提取len(Text)else(statement\u end\u offset-statement\u start\u offset)/2 end),因为SPit中的实际查询应该是子字符串(qt.Text,qs.statement\u start\u offset/2,case when(qs.statement\u end\u offset=-1)然后LEN(qt.text)ELSE(qs.statement\u end\u offset-qs.statement\u start\u offset)/2 end)作为实际查询,