Sql-Server
sys.dm_exec_query_stats 和 sys.dm_exec_cached_plans 有什麼區別?
據我了解,從
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
顯然它有關於查詢執行統計和計劃的不同資訊。