SQL Serverのプランキャッシュをクリアした後、ストアドプロシージャを実行せずにストアドプロシージャの実行プランを再生成するにはどうすればよいですか?
今朝統計を更新したとき、ストアドプロシージャの1つが非常に遅く実行されていました。一部のgoogle-fuによると、プランのキャッシュをクリアすることで問題を解決できることがわかりました。ただし、これを再度行う必要がある場合は、ユーザーが応答を待っている間にプランが再生成されることによるパフォーマンスへの影響を回避したいと思います。
SQL Serverのバージョン/エディションは2016 Enterpriseです。
SQL Serverのプランキャッシュをクリアした後、ストアドプロシージャを実行せずにストアドプロシージャの実行プランを再生成するにはどうすればよいですか?
できない/できない。実行プランは、オブジェクトが実行されるときに生成されます。プランキャッシュにプランが必要な場合は、オブジェクトを実行する必要があります。ただし、ストアドプロシージャへの入力パラメーターが少なくとも1つあると仮定すると、おそらく大多数のケースを表す値を使用する必要があります。そうしないと、キャッシュに理想的でない/「悪い」プランを強制する可能性があります。
これを再度行う必要がある場合は、ユーザーが応答を待っている間にプランが再生成されることによるパフォーマンスへの影響を回避したいと思います。
最初のユーザーがプランを使用するまでにプランがキャッシュ内にあることさえ保証できないため、パフォーマンスヒットを取得する方がよいでしょう。 SQL Serverが他の操作のためにより多くのメモリが必要であると判断した場合、プランは削除できます。したがって、最初のユーザーが使用する前にドロップされた場合、何も保存せず、サーバーがプランを2回生成するようにしました。
しかも初めてのヒットです。これを「事前」キャッシングで有利に使用しようとしているので、これを認識しています。ただし、これは、パフォーマンスにわずかに影響を与えるのは初めてのユーザーだけであることも意味します。その後、計画が破棄されない限り、他の人はとにかくパフォーマンスヒットを経験しません。
無駄な時間と労力を大幅に節約し、事前キャッシュについて心配する必要はありません。毎回すべてのユーザーに影響を与えるストアドプロシージャでのクエリのパフォーマンスの問題についてさらに心配し、それらのトラブルスポットを改善するために時間を賢く費やす。
プランキャッシュを再設定できる唯一の方法は、ストアドプロシージャまたはアドホックT-SQLから関連するT-SQLを実行することです。
1日の始めに「準備」する必要のあるストアドプロシージャがいくつかある場合は、SQL Serverエージェントを使用して、ビジネスが「オンライン」になる前に、事前定義されたパラメーターでそれらを実行できます。
sp_recompile を探していたと思います。 msdnリンクで述べたように、sp_recompile
"ストアドプロシージャ、トリガー、ユーザー定義関数が次に実行されるときに再コンパイルされるようにします。これは、既存のプランをプロシージャキャッシュから削除して、次にそのプロシージャが新しいプランを作成するように強制します。またはトリガーが実行されます。」
Brent Ozarは 大きなマイナス面 について言及していますが、このシステムストアドプロシージャを本番環境で使用することには注意が必要です。