如何分析存储过程

pet*_*ter 31 sql-server sql-server-2012

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

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

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

Mik*_*lsh 29

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 跟踪将消失,我们将拥有的只是扩展事件)。我还建议您通过 Column Filters 按钮过滤掉尽可能多的背景噪音,以确保您只捕获必要的内容。您可以使用 Kevin 在他的好答案中描述的步骤使用 Profiler 工具设置跟踪,然后从同一 GUI 添加过滤器。然后,您可以将跟踪导出为脚本,并在 SQL Server 跟踪上运行该脚本到不包含数据库或事务日志文件的文件夹中的文件。要导出,您只需设置跟踪,运行几秒钟以确保捕获您想要的内容,停止它,然后转到菜单栏和File->Export->Script Trace Definition并保存文件。然后在要跟踪的服务器上的新查询窗口中打开该文件。你可以看到更多关于该脚本创建通过查看您刚刚通过启动创建的脚本中使用的各种存储过程的说明文章的选择和定义在这里

如果您有时间并想学习,您还可以阅读一些关于扩展事件的文章,并了解如何获取信息。当您准备好开始博客文章时,Jonathan Kehayias是一个很好的博客资源。

  • 当 SP:StmtCompleted 只在查询文本中显示“-- Encrypted text”时呢?我们如何找出正在访问哪些表? (2认同)

Kev*_*sel 24

您可以通过 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';
Run Code Online (Sandbox Code Playgroud)