我们的团队给我分配了一项新任务来研究一个巨大的存储过程的性能。当我在具有正确数据的开发环境中观察时,我注意到该过程需要相当长的时间才能执行。在我的场景中,大约需要 45 分钟。INSERT/DELETE/UPDATE存储过程中使用了多个查询。但我无法获得导致问题的查询。查询中使用的数据量也少得多。
我怎样才能准确地指出
query正在stored procedure执行的内容?
我的服务器版本是SQL Server 2008 R2.
我们的团队给我分配了一项新任务来研究一个巨大的存储过程的性能。当我在具有正确数据的开发环境中观察时,我注意到该过程需要相当长的时间才能执行。在我的场景中,大约需要 45 分钟。INSERT/DELETE/UPDATE存储过程中使用了多个查询。但我无法获得导致问题的查询。查询中使用的数据量也少得多。
我怎样才能准确地指出
query正在stored procedure执行的内容?
我的服务器版本是SQL Server 2008 R2.
有几种方法可以找出作为存储过程的一部分执行的查询。了解更多关于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
完成识别导致速度缓慢的查询后,您可以使用实际执行计划来识别查询中的问题。试试这个,请评论它是否适合你。