我试图找出是否有办法识别被调用最多的SP的“版本”。我有一个SP,它被一堆不同的参数调用。我知道SP引起了一些问题,并试图指出问题所在。除了捕获对SP的呼叫并手动筛选结果外,是否可以使用分析器按提供的参数对SP呼叫进行分组?
我不是数据库(A / E),只是一个Web开发人员,所以任何正确方向的提示/点都会有所帮助。谢谢!
编辑:重新编译SP没有多大帮助。
答案 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')