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

How to track which query in the corresponding stored procedure is executing

我们的团队给我分配了一项新任务来研究一个巨大的存储过程的性能。当我在开发环境中使用适当的数据进行观察时,我注意到该过程需要花费相当长的时间来执行。在我的场景中,大约需要 45 分钟。存储过程中使用了多个 INSERT/DELETE/UPDATE 查询。但我无法获得导致问题的查询。查询中使用的数据量也很少。

How can I pinpoint to the exact query in the stored procedure which is getting executed?

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

有几种方法可以找出作为存储过程的一部分执行的查询。详细了解 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

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