「アドホックワークロード向けに最適化」オプションをオンにすると、2回目に実行されるアドホッククエリが1回目と同じくらい遅くなります。これは、実行プランをコンパイルして同じデータ(キャッシュせずに)最初の2回。
これは大した問題ではないかもしれませんが、クエリをテストするときに気づくでしょう。
では、このオプションをオンにし、キャッシュに1回限りのアドホッククエリをいっぱいにしないと、どうなりますか?
キャッシング管理アルゴリズム:
この最適化機能が導入されたため、キャッシュ管理アルゴリズムも更新されました。
Kimberly Trippの記事は、このアルゴリズムの変更に関するKalen Delaneyの投稿も参照しています。
彼女はそれを最もよく説明しています:
この変更により、実際にプランのキャッシュサイズが計算されます。このサイズで、SQL Serverはメモリの負荷があることを認識し、キャッシュからプランの削除を開始します。削除される計画は、再利用されていない安価な計画であり、これは良いことです。
これは、リソースを解放する必要があるときに、これらの厄介なワンタイマー計画が最初に実行されることを意味します。
だから今の質問は次のようになります:
「SQL Serverが必要なときに、未使用の計画を削除するの世話をするとき?なぜ我々は『アドホックワークロードの最適化』を必要なのですか」
と私の答えはあなたが定期的に非パラメータ化広告の動的SQL生成どっさりのS-トンを持っている場合、 -hocクエリの場合、この機能をオンにするのが最適です。
最大キャッシュメモリ領域を使い果たした後、キャッシュプラン/データの削除を強制するように、システムリソースに負担をかけないようにします。
これをいつオンにする必要があるかを知るにはどうすればよいですか?
現在キャッシュしているアドホックプランの数と、それらが消費しているディスク領域の量を示すために私が書いたクエリは次のとおりです(結果は1日を通して変化します-負荷が大きいときにテストしてください):
--Great query for making the argument to use "Optimize for Ad Hoc Workloads":
SELECT S.CacheType, S.Avg_Use, S.Avg_Multi_Use,
S.Total_Plan_3orMore_Use, S.Total_Plan_2_Use, S.Total_Plan_1_Use, S.Total_Plan,
CAST( (S.Total_Plan_1_Use * 1.0 / S.Total_Plan) as Decimal(18,2) )[Pct_Plan_1_Use],
S.Total_MB_1_Use, S.Total_MB,
CAST( (S.Total_MB_1_Use * 1.0 / S.Total_MB ) as Decimal(18,2) )[Pct_MB_1_Use]
FROM
(
SELECT CP.objtype[CacheType],
COUNT(*)[Total_Plan],
SUM(CASE WHEN CP.usecounts > 2 THEN 1 ELSE 0 END)[Total_Plan_3orMore_Use],
SUM(CASE WHEN CP.usecounts = 2 THEN 1 ELSE 0 END)[Total_Plan_2_Use],
SUM(CASE WHEN CP.usecounts = 1 THEN 1 ELSE 0 END)[Total_Plan_1_Use],
CAST((SUM(CP.size_in_bytes * 1.0) / 1024 / 1024) as Decimal(12,2) )[Total_MB],
CAST((SUM(CASE WHEN CP.usecounts = 1 THEN (CP.size_in_bytes * 1.0) ELSE 0 END)
/ 1024 / 1024) as Decimal(18,2) )[Total_MB_1_Use],
CAST(AVG(CP.usecounts * 1.0) as Decimal(12,2))[Avg_Use],
CAST(AVG(CASE WHEN CP.usecounts > 1 THEN (CP.usecounts * 1.0)
ELSE NULL END) as Decimal(12,2))[Avg_Multi_Use]
FROM sys.dm_exec_cached_plans as CP
GROUP BY CP.objtype
) AS S
ORDER BY S.CacheType
結果:
「X MBの場合」や「アドホックのX%がシングルユースの場合」と言ってこれをオンにするつもりはありません。
Sproc、トリガー、ビュー、またはパラメーター化/準備されたSQLには影響せず、アドホッククエリにのみ影響します。
個人的な推奨事項は、Prod環境で有効にするだけですが、開発環境では無効にすることを検討してください。
私はこれを言うだけで、あなたが分以上実行にかかり、クエリを最適化している場合、その後、あなたはそれがキャッシュされたとして行くだろうどれだけ速く見ることができる前に、それを3回実行したくないので、デベロッパーのため- すべての一度だけ編集して、最適な最適化設計を見つけます。
あなたの仕事がこれを終日行うことを必要としない場合、気をつけて、DBAにどこでもそれをつけるように頼んでください。