パフォーマンスモニターカウンターに表示されるSQLコンパイルの高さ(再コンパイルではない)の原因を調べたい。
これが私の見解です:SQlコンパイルが大量に表示される場合は、次の理由により、システム上のクエリがキャッシュされていません。
- 多くのアドホッククエリ
SQlがキャッシュしないクエリの実行:
UPDATE table1 SET col1 = '8000文字より長い文字列.....' WHERE key_column = some int
プランがタイムアウトして、キャッシュから削除されています。キャッシュのスペースが不足しているか、プランが十分に長く使用されていません。
プロファイラーでのキャッシュ挿入のキャプチャに近い唯一のことは、ストアドプロシージャ-> SP:CacheInsertsですが、ストアドプロシージャキャッシュの管理のみを行います。
だから私はアドホッククエリを取得するために以下を試しました:
SELECT [cp].[refcounts] -- when Refcounts becomes 0, plan is excluded from cache.
, [cp].[usecounts]
, [cp].[objtype]
, st.[dbid]
, st.[objectid]
, st.[text]
, [qp].[query_plan]
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_sql_text ( cp.plan_handle ) st
CROSS APPLY sys.dm_exec_query_plan ( cp.plan_handle ) qp ;
コンパイルの原因となったクエリはobjtype = Adhocのクエリであると考えましたが、これも再コンパイルに関連している可能性があります。次に、プロファイラーを実行し、クエリをキャプチャして再コンパイルを行い、上記のリストから除外する必要があります。
私は正しい方向に進んでいますか?
あまり作業をせずにSQLコンパイルだけを実行するために使用できる単一のクエリはありますか?
上記の知識を得るのに役立つリソース:
http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/954b4fba-3774-42e3-86e7-e5172abe0c83
http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=143946
http: //technet.microsoft.com/en-nz/library/cc966425(en-us).aspx
http://www.sqlservercentral.com/Forums/Topic914951-360-1.aspx
どんな助けでも本当に感謝しています。