MSSQL如何获取存储过程中正在执行的真实SQL语句(定位存储过程中最耗时部分)

0    21    2

Tags:

👉 本文共约1261个字,系统预计阅读时间或需5分钟。

存储过程优化的重点和难点在于如何找到存储过程中最耗时的部分。尤其对于很长的存储过程,或者多层嵌套调用的存储过程,难度会更大。

大致有两种情况:

  • 慢在自身SQL
  • 慢在执行其他嵌套存储过程/函数/link的SQL

需求

SQL server如何找到存储过程中的正在执行的真实的sql语句?????

模拟存储过程一直在运行:

方法1:直接查询

以下SQL的internal_SQL_TEXT就是存储过程真实的内部SQL,而Parent_SQL_TEXT就是存储过程全部内容。

方法2:SQL Server Profiler(推荐)

通过 SQL Server Management Studio,可以使用 SQL Server Profiler 来监视数据库活动。在 SQL Server Profiler 中,选择 "TSQL_SPs" 模板,建议保存到表中,然后选择spid列,然后启动跟踪会话。在跟踪结果中,可以查看每个存储过程的执行情况,以及存储过程中执行的实际 SQL 语句。

MSSQL如何获取存储过程中正在执行的真实SQL语句(定位存储过程中最耗时部分)

勾选显示所有事件,然后设置事件:

Stored Procedures下的

  • RPC:Completed

  • SP:StmtCompleted

TSQL下的:

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!
  • SQL:BatchCompleted

MSSQL如何获取存储过程中正在执行的真实SQL语句(定位存储过程中最耗时部分)

极限情况下可以将duration设为0,抓取存储过程所有sql执行情况,然后分析trace文件

方法3:查存储过程中各部分sql执行时间

首先从dm_exec_query_stats视图看存储过程整体的执行情况,关注最近、最小和最大执行时间,从这里可以看到存储过程执行时间是不是差异很大。

然后通过关联视图再看每部分sql执行时间,注意这里只包含本存储过程中的SQL,如果有嵌套的存储过程,其中SQL不会显示。

这里也要注意各部分SQL平均时间的总和与存储过程执行时间的差异

  • 如果存储过程执行20秒,各部分SQL平均时间之和也接近20秒,说明就慢在自身的语句,可以直接分析慢SQL

  • 如果存储过程执行20秒,各部分SQL平均时间之和不到50毫秒,则可能有以下情况:

    • 并不是这个存储过程里面的语句慢,而是它中途跳出去执行了别的慢存储过程/函数、或者通过link访问其他库执行慢SQL,它其实是个受害者。

    • 这个存储过程的语句大部分情况都执行很快,但如果遇到特殊的变量等,某些SQL执行时间可能变得很长。但由于这种情况比较少,各SQL的平均执行时间看起来都很短。

总结

1、推荐方法2

参考

https://blog.csdn.net/Hehuyi_In/article/details/106009361

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部