web-dev-qa-db-ja.com

Microsoft SQL Server内からすべての古いクエリプランをクリアするにはどうすればよいですか?

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

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

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

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

同じサーバー上の他のデータベースに依存している30人程度のユーザーに影響を与えずにこれを行うにはどうすればよいですか?

私の以前の答えに対する私の謝罪。

1)クエリがストアドプロシージャから実行されるたびに変化することがわかっている場合は、CREATE PROCEDUREステートメントにWITH RECOMPILEオプションを追加します。 WITH RECOMPILEオプションは、ストアドプロシージャ実行プランの再利用を防止するため、SQL Serverはこのプロシージャのプランをキャッシュせず、プロシージャは実行時に再コンパイルされます。クエリがストアドプロシージャから実行されるたびに異なる場合、WITH RECOMPILEオプションを使用するとパフォーマンスが向上する可能性があります。この場合、誤った実行プランが使用されないためです。

2) SE PLANクエリを使用するプランガイドを作成する すべてのタイプのクエリ(すべてのストアドプロシージャリクエストタイプ)のヒントを実行プランに強制する必要があります。

ここに 記事 が役立つ実行計画についてです。

7
garik

ここで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を操作するのではなく、クエリを最適化できる必要があります。また、インスタンスの待機イベントの分析に時間をかけることもお勧めします。

13
SQLRockstar

DBCC FREEPROCCACHE

このコマンドを使用すると、プロシージャキャッシュ全体を1つのコマンドにクリアできます。このコマンドを使用する前に、必ずドキュメントをお読みください。解説セクションを数回読みます。

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

マット

7
Matt M