我们的团队已向我分配了一项新任务,以研究大型存储过程的性能。当我在开发环境中观察到正确的数据时,我注意到该过程需要花费大量时间才能执行。在我的情况下,大约花费了45分钟。存储过程中使用了多个INSERT/DELETE/UPDATE
查询。但是我无法获得引起该问题的查询。查询中使用的数据量也很少。
如何在
query
中精确定位stored procedure
哪个正在执行?
我的服务器版本为SQL Server 2008 R2
。
答案 0 :(得分:1)
有几种方法可以找出作为存储过程一部分执行的查询。了解有关DMVs
和SQL 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
一旦确定了导致运行缓慢的查询,就可以使用实际执行计划来确定查询中的问题。 试试这个,请评论它是否对您有用。