在SQL Server 2005中识别最常用的存储过程变体的最快方法

时间:2010-08-17 18:36:48

标签: sql-server-2005 tsql stored-procedures

我试图找出是否有办法识别被调用最多的SP的“版本”。我有一个SP,它被一堆不同的参数调用。我知道SP引起了一些问题,并试图指出问题所在。除了捕获对SP的呼叫并手动筛选结果外,是否可以使用分析器按提供的参数对SP呼叫进行分组?

我不是数据库(A / E),只是一个Web开发人员,所以任何正确方向的提示/点都会有所帮助。谢谢!

编辑:重新编译SP没有多大帮助。

4 个答案:

答案 0 :(得分:15)

这将为您提供前50个最常用的过程和过程中的陈述,从这里开始:Display the 50 most used stored procedures in SQL Server

SELECT TOP 50 * FROM(SELECT COALESCE(OBJECT_NAME(s2.objectid),'Ad-Hoc') AS ProcName,
  execution_count,s2.objectid,
    (SELECT TOP 1 SUBSTRING(s2.TEXT,statement_start_offset / 2+1 ,
      ( (CASE WHEN statement_end_offset = -1
  THEN (LEN(CONVERT(NVARCHAR(MAX),s2.TEXT)) * 2)
ELSE statement_end_offset END)- statement_start_offset) / 2+1)) AS sql_statement,
       last_execution_time
FROM sys.dm_exec_query_stats AS s1
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2 ) x
WHERE sql_statement NOT like 'SELECT * FROM(SELECT coalesce(object_name(s2.objectid)%'
and OBJECTPROPERTYEX(x.objectid,'IsProcedure') = 1
and exists (SELECT 1 FROM sys.procedures s
WHERE s.is_ms_shipped = 0
and s.name = x.ProcName )
ORDER BY execution_count DESC

访问该链接只获取proc名称的查询,但我认为这是一个更好的查询,因为它还为procs中的语句提供了

答案 1 :(得分:1)

听起来你只需要能够在短时间内捕获这些信息。在此期间可能会多次调用sproc,但它是一个有限的时间段。

如果是这种情况,也许您可​​以在某处记录sproc调用?如果您可以控制sproc代码,则可以在那里执行日志记录。一种方法是为此目的创建一个特殊的表,在现有的sproc的开头或结尾向该表添加一个INSERT,并等待一些记录在表中累积

根据具体情况,您可以在自定义日志记录表中为每个sproc参数创建一个列。

然后,在执行日志记录的过程中,您将获得有关sproc使用情况的充足信息。

鉴于表中累积的数据,您可以查询以查找最常见的参数值,包括用户或应用程序或网页等,sproc调用的开始和结束的日期时间,以及其他任何内容你记录。

这不会涉及对应用程序代码的任何更改,并且在您完成故障排除后可以完全取消。因此,除了所有日志记录不可避免的性能影响之外,这种方法的价格并不高。

编辑:对于缺少在sys.dm_exec_query_stats等表上运行DMV查询所需的特殊权限的用户,此方法可以替代。在许多商店中,获得此类权限(特别是在生产数据库上)对于开发人员来说是不可行的。

答案 2 :(得分:0)

如果您知道哪个SP导致问题,那么您只能记录从该SP内传递给它的参数吗?您可以使用参数列表设置一个表,然后将它们与完成该过程所需的时间一起记录,然后查询该表以查看哪些参数导致最差的性能。

答案 3 :(得分:0)

我喜欢这段代码,用于撤回并查看执行统计信息。以及给定存储过程的缓存查询计划。在Management Studio中,您可以单击“query_plan”列中返回的XML以查看执行计划的图形版本。

SELECT qp.*,qs.*,st.text
    FROM sys.dm_exec_query_stats qs 
        CROSS APPLY sys.dm_exec_sql_text(sql_handle) st
        CROSS APPLY sys.dm_exec_query_plan(plan_handle) qp
    WHERE st.objectid= object_id('YourStoredProcedureName')