如何跟踪相应存储过程中正在执行哪个查询

时间:2018-07-12 09:06:29

标签: sql-server tsql sql-server-2008-r2

我们的团队已向我分配了一项新任务,以研究大型存储过程的性能。当我在开发环境中观察到正确的数据时,我注意到该过程需要花费大量时间才能执行。在我的情况下,大约花费了45分钟。存储过程中使用了多个INSERT/DELETE/UPDATE查询。但是我无法获得引起该问题的查询。查询中使用的数据量也很少。

  

如何在query中精确定位stored procedure   哪个正在执行?

我的服务器版本为SQL Server 2008 R2

1 个答案:

答案 0 :(得分:1)

有几种方法可以找出作为存储过程一部分执行的查询。了解有关DMVsSQL Profiler的更多信息。两者都会给您一个疏忽,以查明存储过程中正在使用的查询。

在SQL Profiler中,使用SP:StmtCompleted或SP:StmtStarting将语句包含在查询中。但是我建议不要使用Profiler,因为它也会影响系统内存。同样,它也可能会给您带来不必要的其他信息。

最好的方法是使用DMV(动态管理视图)。如果您知道进程ID(SPID),请使用以下查询找出该查询

第一个查询将为您提供有关存储过程的详细信息,第二个查询将为您提供当前正在执行的确切查询。将以下查询中的 SPID 替换为流程中相应的 SPID

SELECT  requests.session_id, 
        requests.status, 
        requests.command, 
        requests.statement_start_offset,
        requests.statement_end_offset,
        requests.total_elapsed_time,
        details.text
FROM    sys.dm_exec_requests requests
CROSS APPLY sys.dm_exec_sql_text (requests.sql_handle) details
WHERE   requests.session_id = SPID
ORDER BY total_elapsed_time DESC

SELECT  SUBSTRING(detail.text, 
                  requests.statement_start_offset / 2, 
                  (requests.statement_end_offset - requests.statement_start_offset) / 2)
FROM    sys.dm_exec_requests requests
CROSS APPLY sys.dm_exec_sql_text (requests.sql_handle) detail
WHERE   requests.session_id = SPID

一旦确定了导致运行缓慢的查询,就可以使用实际执行计划来确定查询中的问题。 试试这个,请评论它是否对您有用。