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

Sql server 如何跟踪相应存储过程中正在执行的查询,sql-server,tsql,sql-server-2008-r2,Sql Server,Tsql,Sql Server 2008 R2,我们的团队向我分配了一项新任务,研究一个大型存储过程的性能。当我使用适当的数据在开发环境中观察时,我注意到该过程需要相当长的时间来执行。在我的场景中,大约需要45分钟。存储过程中使用了多个INSERT/DELETE/UPDATE查询。但我无法获取导致问题的查询。查询中使用的数据量也非常少 如何精确定位存储过程中的查询 哪个会被处决 我的服务器版本是SQLServer2008R2 有两种方法可以找到作为存储过程一部分执行的查询。了解有关DMVs和SQL探查器的更多信息。这两种方法都会让您忽略如何精

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

如何精确定位
存储过程中的
查询
哪个会被处决


我的服务器版本是
SQLServer2008R2

有两种方法可以找到作为存储过程一部分执行的查询。了解有关
DMVs
SQL探查器的更多信息。这两种方法都会让您忽略如何精确定位存储过程中使用的查询

在SQL探查器中,使用SP:StmtCompleted或SP:stmtstart将语句包含在查询中。但我建议不要使用探查器,因为它也会影响系统内存。此外,它可能会给你不想要的额外信息以及

最好的方法是使用DMV(动态管理视图)。如果您知道进程id(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
一旦确定了导致缓慢的查询,就可以使用实际执行计划来确定查询中的问题。
试试这个,请评论它是否适合您。

可能会有帮助。在日志表运行时将记录插入日志表如何?@Cato您的意思是添加一个新表吗?那将是一笔开销。此外,我们还需要在所有位置添加更多代码。这将是一项开销,但与45分钟的运行时间相比肯定不会太大-添加代码任务取决于您的进程有多大,无论您是在现场运行还是在测试台上运行—这是我所做的,而不是尝试实时监控—祝您的项目好运。我如何获得存储过程的SPID?@Krish如果您是通过SSMS执行存储过程,那么它可能在您的SSMS的右角,在您的用户id之后,或者使用SP_WHO。