Sql-Server

sys.dm_exec_query_stats 和 sys.dm_exec_cached_plans 有什麼區別?

  • January 15, 2020

據我了解,從sys.dm_exec_query_stats,我們可以交叉應用其他 DMF 來獲取語句級記憶體計劃和查詢文本。從sys.dm_exec_cached_plans中,我們可以獲得記憶體的計劃和查詢文本(通過交叉應用其他 DMF)。那麼有什麼區別呢?

在獲取計劃方面,使用 sys.dm_exec_query_stats 您可以使用 statement_start_offset 和 End offset 來獲取儲存過程中單個語句的計劃。

例如

select top 100 object_name(object_id),ps.execution_count as proc_exec_count, qs.plan_generation_num, qs.execution_count as Stmt_exec_count,qs.total_elapsed_time/qs.execution_count as AVG_Run_Time,   qs.total_worker_time/qs.execution_count AS Avg_CPU_Time,
qs.last_elapsed_time, qs.min_elapsed_time, qs.max_elapsed_time,qs.min_rows,qs.max_rows,
SUBSTRING ([st].[text], 
       ([qs].[statement_start_offset] / 2) + 1, 
       ((CASE [statement_end_offset] 
           WHEN -1 THEN DATALENGTH ([st].[text]) 
           ELSE [qs].[statement_end_offset] END 
           - [qs].[statement_start_offset]) / 2) + 1) 
           AS [StatementText],cast(s3.query_plan as xml) query_plan
from sys.dm_exec_procedure_stats ps  
JOIN [sys].[dm_exec_query_stats] AS [qs]
       ON [ps].[plan_handle] = [qs].[plan_handle]
cross apply sys.dm_exec_text_query_plan ([qs].[plan_handle], statement_start_offset, statement_end_offset) s3
CROSS APPLY [sys].[dm_exec_sql_text]    ([qs].[sql_handle]) AS [st]
where database_id=db_id('DB') --and qs.execution_count >100 
and object_id in (object_id('SP Name')) 
ORDER BY avg_run_time DESC

顯然它有關於查詢執行統計和計劃的不同資訊。

引用自:https://dba.stackexchange.com/questions/156951