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


12

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

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

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

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

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


回答:


7

以前の回答に対する謝罪。

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

2)実行計画を強制するには、すべての種類のクエリ(ストアドプロシージャリクエストの種類ごと)に対してUSE PLANクエリヒントを使用するプランガイド作成する必要があります。

ここに役立つ実行計画に関する記事があります。


WITH RECOMPILEを使用することに同意します。これは、私が構築したシステムで実行しました。しかし、私はSQLソースにアクセスできません...それはアプリケーション内から実行されます。
マイケルライリー-別名ガニー

この場合の@Cape Cod Gunnyは、DBCC FLUSHPROCINDBを試してください。SQLServer全体ではなく、SQL Server上の特定のデータベースのストアドプロシージャキャッシュをクリアするために使用します。テストの前にこのコマンドを使用して、以前のストアドプロシージャプランがテスト結果に悪影響を与えないようにすることができます。例:DECLARE @intDBID INTEGER SET @intDBID =(SELECT dbid FROM master.dbo.sysdatabases WHERE name = 'database_name')DBCC FLUSHPROCINDB(@intDBID)
garik

問題は解決されました。検索条件を保存するために使用される一時テーブルがデータを永続的に蓄積していることが判明しました。プロセスは、データを収集する前にこのテーブルからデータを切り捨てることになっています。素敵なsqlスニペットをありがとう。
マイケルライリー-別名ガニー

13

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

2番目の質問は、「同じサーバー上の他のデータベースに依存している30人ほどのユーザーに影響を与えずにこれを行うにはどうすればよいですか?」です。短い答えは「できません」です。すべてのプランを削除すると、メモリ内のプランに依存している他のユーザーがパフォーマンスに影響を与える可能性が高くなります。

これを回避するには、手動での介入が必要です。plan_handleがあれば、DBCC FREEPROCCACHEを使用して特定の計画を削除できます。

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

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は問題を解決しませんでした。アクティビティとイベントを監視しています。物理I / Oはありません。このアプリケーション:.Net Sql Client Data Providerにかかっているようです。待機タイプはCXPACKETです。
マイケルライリー-別名ガニー

CXPACKETは、クエリが並列処理されることを意味します。クエリに対して実行されているスレッドの数を確認し、それらの待機を調べることができますか?Adam Machanicの無料ツールWhoIsActive sqlblog.com/files/folders/release/entry29675.aspxを使用できます。
SQLRockstar

7

DBCC FREEPROCCACHE

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

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

マット


DBCC FREEPROCCACHEを使用してみましたが、問題は解決しませんでした。私は1時間後にプロセスを殺してしまいました。
マイケルライリー-別名ガニー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.