如何分析存储过程


26

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

例如,探查器可以捕获存储过程中的每个单独的SQL语句,它是什么以及运行需要多长时间等?

我正在尝试诊断合并复制存储过程,并且必须在合并代理的完整运行中捕获这一点。似乎不可能抓住存在性能问题的存储过程并再次运行它,因为这并不慢。

Answers:


27

Kevin的答案描述了在SQL Trace / SQL Profiler中捕获哪些事件。稍微扩展一下该答案- SP:StmtCompleted听起来会像正在完成的存储过程中一样显示每个语句。

另外,如果您在繁忙的系统上并尝试诊断性能问题,则应谨慎使用SQL Profiler。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-> Script Trace Definition并保存文件。然后在要跟踪的服务器上的新查询窗口中打开该文件。通过从这里开始,查看刚在该脚本中使用的各种存储过程的帮助文章,可以了解有关此脚本的选项和定义的更多信息。

如果您有时间并且想学习,还可以阅读有关扩展事件的一些文章,以及如何获取信息。当您准备从此处开始时,Jonathan Kehayias是一个不错的博客文章资源。


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

与您有同样的问题@ Brain2000 ....
wenzzzel

21

您可以通过SQL Server Profiler捕获存储过程中的各个语句。为此,请在“事件选择”选项卡中,单击“显示所有事件”复选框。然后,向下滚动到“存储过程”类别,然后选中“ SP:StmtCompleted ”旁边的框。如果您还选择了SQL:BatchStartedSQL: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';
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.