我正在使用SQL Server 2012,并且想知道如何分析存储过程

例如,探查器可以捕获存储过程中的每个单独的SQL语句,它是什么以及运行多长时间等?我正在尝试诊断合并复制存储过程,并且必须在合并代理的完整运行中捕获这一点。似乎不可能抓住存在性能问题的存储过程并再次运行它,因为那时候它并不慢。

#1 楼

Kevin的答案描述了在SQL Trace / SQL Profiler中捕获哪些事件。为了进一步扩展该答案-SP:StmtCompleted会像听起来一样显示存储过程中已完成的每个语句。使用SQL事件探查器要小心。 SQL Profiler比跟踪文件或使用扩展事件要慢得多。 Jonathan Kehayias的这篇博客文章显示了使用SQL Profiler造成的系统性能大约90%的开销,以及从跟踪到文件大约10%的开销。较少用于扩展事件。这就是为什么通常建议不要运行SQL Profiler本身

尽管可以通过扩展事件获得此信息,但我建议您仍然使用SQL Trace(SQL Profiler背后的技术),而是跟踪到文件(如果您想投资学习和使用扩展事件,那么这将是一种方法) SQL Server SQL Trace的未来版本将不复存在,而我们所拥有的只是扩展事件。我还建议您通过“列过滤器”按钮过滤掉尽可能多的背景噪音,以确保仅捕获必要的内容。您可以使用Profiler工具使用Kevin在其良好答案中描述的步骤来设置跟踪,然后从同一GUI添加过滤器。然后,您可以将跟踪导出为脚本,并在SQL Server上运行该脚本,以跟踪到不包含数据库或事务日志文件的文件夹中的文件。要导出,只需设置跟踪,运行几秒钟以确保您正在捕获所需的内容,将其停止,然后转到菜单栏,然后​​进入菜单> File-> Export并保存文件。然后在要跟踪的服务器上的新查询窗口中打开该文件。通过从这里开始,查看刚创建的脚本中使用的各种存储过程的帮助文章,可以了解有关此脚本的选项和定义的更多信息。

如果您有时间并且想学习,还可以阅读有关扩展事件的文章,并了解如何捕获信息。当您准备从此处开始时,Jonathan Kehayias是提供大量博客文章的资源。

评论


当SP:StmtCompleted仅在查询文本中显示“-加密文本”怎么办?我们如何找出正在访问哪些表?

– Brain2000
2014年10月8日在16:46

与您@ Brain2000一样的问题....

–wenzzzel
19 Mar 24 '19在15:23

#2 楼

您可以通过SQL Server Profiler捕获存储过程中的各个语句。为此,请在“事件选择”选项卡中,单击“显示所有事件”复选框。然后,向下滚动到“存储过程”类别,然后选中“ SP:StmtCompleted”旁边的框。如果还选择了SQL:BatchStarted和SQL:BatchCompleted事件,则可以获取存储过程运行的从头到尾的图片,并通过SPID将其捆绑在一起。

它也可能会有所帮助查看计划缓存,以查看是否可以为执行缓慢的过程获取查询计划。您可以从以下内容开始:

SELECT 
    OBJECT_NAME(st.objectid,st.dbid) AS ObjectName,
    cp.usecounts AS ExecutionCount,
    st.TEXT AS QueryText,
    qp.query_plan AS QueryPlan
FROM 
    sys.dm_exec_cached_plans AS cp
    CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
    CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
WHERE 
    cp.objtype = 'Proc'
    AND OBJECT_NAME(st.objectid,st.dbid) = 'YourStoredProcedure';