【问题标题】:Quickest way to identify most used Stored Procedure variation in SQL Server 2005识别 SQL Server 2005 中最常用的存储过程变体的最快方法
【发布时间】:2010-08-17 18:36:48
【问题描述】:

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

我不是 DB(A/E),只是一名网络开发人员,所以任何正确方向的提示/点都会有所帮助。谢谢!

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

【问题讨论】:

  • 我不认为这应该作为重复而被拒绝,因为在这种情况下,他们正在寻找相同存储过程的参数变化。另一个问题是最常调用哪些存储过程。在这里,我们知道哪个存储过程需要注意。问题在于各种参数。这需要一种不同的故障排除方法。

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


【解决方案1】:

这将为您提供前 50 个最常用的 procs 和 procs 中的语句,来自这里: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 中的语句

【讨论】:

  • 哦,聪明。我从没想过将定义加入最常用的查询
  • 我一定会尝试的。
  • 如何获取指定的数据库?
【解决方案2】:

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

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

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

那么在执行日志记录的时间段内,您将获得有关存储过程使用情况的充分信息。

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

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

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

【讨论】:

  • 是的,这绝对可以。在问这个问题时,我主要考虑的是 SQL Profiler 捕获事物的方式。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    我喜欢这个用于拉回和查看执行统计信息的 sn-p 代码。以及给定存储过程的缓存查询计划。在 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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-20
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 2012-04-18
      • 2010-10-22
      相关资源
      最近更新 更多