私の理解によると、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
そして明らかに、クエリ実行の統計と計画に関して異なる情報があります。