オンラインの本によると、私は長時間実行されているストアドプロシージャの分析を行っていますが、なんらかの異常に遭遇しましたsys.dm_exec_procedure_stats
は、キャッシュされたストアドプロシージャプランごとにone行のみを表示する必要がありますが、テーブルにtwiceと表示されるユーザーストアドプロシージャが1つあります。
このストアドプロシージャの両方の「バージョン」は、実行時間/カウントが大きく異なります。
これは、さまざまなプランがキャッシュされて使用されているためですか?もしそうなら、SQLサーバーが同じobject_idに対して複数のプランをキャッシュしていることに気づかなかったので、それは一種の1対1の取引だと思いましたか?さらに、これが事実である場合、DMVのBOLS定義と矛盾しているように思われますか?
これに加えて、使用中のプランの2つのバージョンがある場合、どのプランがどのような状況で使用されているかをどのように知ることができますか?
他の誰かがこれに遭遇しましたか?
ポールのコメントから作業しているだけです。 Books Onlineのステートメントとあなたの解釈の主な違い:
...キャッシュされたストアドプロシージャ plan ごとに1行。
次のように読みます:...キャッシュされたストアドプロシージャごとに1行。
属性DMVの内容を調べ、属性名で並べ替えることにより、どのプラン属性が異なり、したがってプランの異なるコピーにつながるかを確認できます。同じテキストの2つの行の値がvalue
列に異なる属性が少なくとも1つ表示されているはずです。
SELECT t.[text], pa.attribute, pa.value
FROM sys.dm_exec_cached_plans AS p
CROSS APPLY sys.dm_exec_sql_text(p.plan_handle) AS t
CROSS APPLY sys.dm_exec_plan_attributes(p.plan_handle) AS pa
WHERE LOWER(t.[text]) LIKE N'%create%procedure%procedure_name%'
AND LOWER(t.[text]) NOT LIKE N'%sys.dm%'
AND pa.is_cache_key = 1
ORDER BY t.[text], pa.attribute;
通常、次の2つの属性のいずれかに違いがあります。
set_options
これは、ARITHABORT
、QUOTED_IDENTIFIER
、ANSI_NULLS
などの設定の実行時の違いによるものです。これについては次の投稿で説明します。
user_id
これは実際にはクエリを実行しているユーザーではありませんが、2人の異なるユーザーが異なるデフォルトスキーマを持っており(値は実際にはschema_id
)、少なくとも1人がストアドプロシージャを呼び出していますなしスキーマプレフィックス(検索パスが異なるため、SQL Serverは異なるプランをキャッシュします-最初にデフォルトスキーマをチェックする必要があります)。私は上記の投稿と以下でこれについて話します:
(また、ストアドプロシージャ内の2つの完全に異なるステートメントの2つの計画ではなく、プロシージャの包括的な計画を確認してください(例:WHERE p.objtype = N'Proc'
))。