tho*_*der 5 sql-server execution-plan
有一个通宵工作运行很长时间。我已经使用探查器来获取跟踪并确定了一个占用大部分执行时间的语句(在存储过程中)。现在我需要查看语句的执行计划,这样我才能知道我能做什么。但是我无法重新运行查询,因为它使用了在 proc 中创建的临时表。并且proc的逻辑相当复杂并且很难重现(涉及从文件系统获取数据以及通过链接服务器与Oracle数据库交换数据)。我并不是说复制是不可能的,而是相当耗时。那么有没有办法可以查看 proc 或语句的执行计划?
那么有没有办法可以查看 proc 或语句的执行计划?
您必须参考 DMV 来提取此类信息。sys.dm_exec_cached_plans
,sys.dm_exec_sql_text
并且sys.dm_exec_query_plan
是要研究的对象。
特别是sys.dm_exec_query_plan
DMF 将返回给定批次或过程的计划(以及组成批次的每个查询的“子计划”)。
注意:重新启动 sql server 将刷新所有 dmv 数据。
例子 :
-- Do not run it in PROD !!!!
-- free up the procedure cache for TESTING ONLY !!
dbcc freeproccache
-- create an SP with different queries
create procedure usp_Kin_Test
as
select name, create_date from sys.objects
where type = 'P'
order by create_date desc
select name, OBJECT_ID from sys.procedures
order by name
-- execute the query
exec usp_Kin_Test
Run Code Online (Sandbox Code Playgroud)
--- 检查 DMV 的缓存查询计划
SELECT deqp.dbid
,deqp.objectid
,CAST(detqp.query_plan AS XML) AS singleStatementPlan
,deqp.query_plan AS batch_query_plan
,ROW_NUMBER() OVER (
ORDER BY Statement_Start_offset
) AS query_position
,CASE
WHEN deqs.statement_start_offset = 0
AND deqs.statement_end_offset = - 1
THEN '-- see objectText column--'
ELSE '-- query --' + CHAR(13) + CHAR(10) + SUBSTRING(execText.TEXT, deqs.statement_start_offset / 2, (
(
CASE
WHEN deqs.statement_end_offset = - 1
THEN DATALENGTH(execText.TEXT)
ELSE deqs.statement_end_offset
END
) - deqs.statement_start_offset
) / 2)
END AS queryText
FROM sys.dm_exec_query_stats deqs
CROSS APPLY sys.dm_exec_text_query_plan(deqs.plan_handle, deqs.statement_start_offset, deqs.statement_end_offset) AS detqp
CROSS APPLY sys.dm_exec_query_plan(deqs.plan_handle) AS deqp
CROSS APPLY sys.dm_exec_sql_text(deqs.plan_handle) AS execText
WHERE execText.TEXT LIKE '%usp_Kin_Test%' -- CHANGE here for your stored procedure !!
Run Code Online (Sandbox Code Playgroud)
注意:您可以通过深入研究 Jonathan此处所述的计划缓存来做许多很酷的事情。另请参阅查询计划元数据的 DMV
归档时间: |
|
查看次数: |
5675 次 |
最近记录: |