web-dev-qa-db-ja.com

sys.dm_exec_query_statsとsys.dm_exec_cached_plansの違いは何ですか?

私の理解によると、sys.dm_exec_query_statsから、他のDMFを相互適用して、ステートメントレベルのキャッシュされたプランとクエリテキストを取得できます。 sys.dm_exec_cached_plansから、キャッシュされたプランとクエリテキストを取得できます(他のDMFを相互適用することにより)。では、違いは何ですか?

1
Just a learner

プランの取得に関しては、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

そして明らかに、クエリ実行の統計と計画に関して異なる情報があります。

1
jesijesi