Microsoft SQL Server内からすべての古いクエリプランをどのようにクリアしますか?

dba.stackexchange https://dba.stackexchange.com/questions/530

  •  16-10-2019
  •  | 
  •  

質問

Microsoft SQLデータベースを使用するシェルフアプリケーションがあります。このアプリケーション内で、各レポートのさまざまな選択基準を選択します。このアプリケーションは、これらのレポートを実行します。

クエリプランの問題があると思います。毎日実行する最初のレポートは、非常に速く7分間実行されます。最初のレポートの後に実行したレポートは1時間以上かかります。

毎晩、SQL ServerエージェントとSQL Serverを停止して起動するスケジュールされたタスクを実行します。 SQL Serverのこの1つのインスタンス内には、他の約25のデータベースがあります。他のデータベースにはパフォーマンスの問題がありませんが、前に述べた棚製品の1つだけです。

SQL Serverが現在メモリにしているすべてのクエリプランをクリアする方法はありますか?

同じサーバー上の他のデータベースに依存する30人ほどのユーザーに影響を与えることなく、これを行うにはどうすればよいですか?

役に立ちましたか?

解決

以前の答えをお詫びします。

1)クエリがストアドプロシージャから実行されるたびに異なることがわかっている場合は、CREATE PROCEDUREステートメントに再コンパイルオプションを追加します。再コンパイルオプションを使用すると、ストアドプロシージャの実行計画の再利用が防止されるため、SQL Serverはこの手順の計画をキャッシュせず、実行時に手順が再コンパイルされます。 with recompileオプションを使用すると、クエリがストアドプロシージャから実行されるたびに異なる場合、パフォーマンスを高めることができます。この場合、間違った実行計画は使用されないためです。

2)あなたはしなければなりません ユースプランクエリを使用するプランガイドを作成する 実行計画を強制するためのすべてのタイプのクエリ(すべてのストアドプロシージャリクエストタイプ)のヒント。

ここは 論文 役立つ実行計画について。

他のヒント

ここで2つの質問をしました。まず、SQLのインスタンスのメモリに保存されているすべてのプランを削除できるかどうかを知りたいです。 Matt Mが提案したように、DBCC Freeproccacheで行われます。

あなたが尋ねた2番目の質問は、「同じサーバーの他のデータベースに依存する30人ほどのユーザーに影響を与えることなく、どうすればこれを行うことができますか?」です。短い答えは「できない」です。すべての計画を削除すると、メモリにある計画に依存している他のユーザーよりもすべてのユーザーがパフォーマンスヒットに苦しむ可能性があります。

これの回避策には、手動で介入する必要があります。 dbcc freeproccacheを使用して、plan_handleを持っている特定のプランを削除できます。

あなたが上で説明していることから、それは計画の問題のように聞こえますが、計画を削除することが答えであるかどうかはわかりません。計画を削除することを考える前に、パラメーターのスニッフィングの方向に向けてください。

http://blogs.msdn.com/b/conor_cunningham_msft/archive/2010/08/11/conor-vs-misbehaving-parameterized-queries-optimize-for-hints.aspx

スケジュールされたベースでDBCC Freeproccacheを倒すのではなく、クエリを最適化できるはずです。また、インスタンスの待機イベントの分析に時間を費やすこともお勧めします。

DBCC Freeproccache

このコマンドを使用して、手順全体のキャッシュを単一のコマンドにクリアできます。このコマンドを使用する前に、必ずドキュメントを読んでください。備考セクションを数回読んでください。

手順キャッシュをクリアすると、次の使用時にストアドプロシージャキャッシュが再コンパイルされます。これはパフォーマンスに影響を与える可能性があります。慎重に使用してください!

マット

ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top