4

最近、SQL Serverで奇妙な問題が発生した場合、SQL Serverのプロシージャ実行計画に奇妙な問題があります

私はストアドプロシージャを持っています(電話SPold)かなりの計算量があります(約6000人のユーザーのために情報をアプリに戻すことはできませんこれは姓に基づいて1000になります))。ストアドプロシージャは通常数秒で実行され、数分ごとに1回呼び出されます。

今朝、ストアドプロシージャが突然実行に4〜10回かかるので、タイムアウトが発生しました。私は、新しい名前(SPnew)でプロシージャのコピーを作成し実行することによって、高速実行時間を再度得ることができることを発見しました。これは私に、実行計画が元の問題SPoldであることを示していたので、私はそれを再コンパイルして実行することに決めました。これにより、結果はより速く(SPnewほど速くはないが)返されるが、その後ユーザからのSPoldへの呼び出しは再び遅くなる。それは新しい計画が保たれていなかったようだった。

これを修正するのは、SPoldExec SPnewを入れて、SPoldを呼び出すと再び高速に戻ります。

誰もここで何が起こっているか考えていませんか?一晩更新されたのは統計だけでしたが、これはSPoldSPnewの両方に影響するはずです。

答えて

4

また、Sql Server 2005で2つの「奇妙な」ケースが発生しました。これは、問題にも関係している可能性があります。

最初のケースでは、私の手技はdboとして実行されたときにprety fastを実行し、アプリケーションから実行されるときには別のユーザーアカウントで実行が遅くなりました。

2番目のケースでは、プロシージャのクエリプランが、プロシージャが最初に呼び出されたパラメータ値に対して最適化され、このプランは後で他のパラメータ値に対しても再利用され、結果として実行が遅くなりました。

解決策は、プロシージャ内のローカル変数にパラメータ値をコピーしてから、パラメータの代わりにクエリ内の変数を使用することでした。

+1

これは役立つかもしれません[アプリケーションで遅く、SSMSで速い? パフォーマンスミステリーを理解する](http://www.sommarskog.se/query-plan-mysteries.html) – Kashif

+0

オクラホマ - これを完全なものとしてマークしていますが、ミッチもパラメータスニッフィングという点では正解です。 Treaschfは私に解決策を与えます...私はまた、最も有益な上記のリンクを読んでいます。 – Milambardo

5

パラメータスニッフィングのために誤ってキャッシュされたクエリプランが発生しているようです。

ストアドプロシージャを投稿できますか?

、あなたはパラメータが盗聴に関連したいくつかの問題を解決するためのパラメータの好ましい値についてOPTIMIZE FORクエリヒントを使用することができます。

OP TIMIZE FORクエリがコンパイルされて最適化されたときに、ローカルの 変数に特定の値を使用するようにクエリオプティマイザに指示します。値はクエリの最適化中にのみ使用され、クエリの実行中では使用されません。 が使用されます。 オプティマイザは、 オプティマイザのパラメータ検出動作を打ち消すことができます。または、プランガイドを作成するときに使用できます。 の詳細については、Recompiling Stored ProceduresおよびOptimizing Queries in Deployed Applications by Using Plan Guidesを参照してください。

OPTION (OPTIMIZE FOR (@myParam UNKNOWN)) 

あなたは、SQL Serverで同じ効果を得ることができます:SQL Server 2005がUNKNOWN FOR OPTIMIZEをサポートしていません

が与えられたパラメータのスニッフィングパラメータを排除します (SQL Server 2008で導入されました)パラメータをローカル変数にコピーして、クエリでローカル変数を使用することで、

+1

残念ながら、comp。実際のクエリを投稿するためのポリシー私はそれについて変更することができますが、それは時間がかかります! インデックスと統計情報は、両方のSP(古いものと新しいもの)が同じDBに存在するため、これらのSPに影響しますか? 私はパラメータスニッフィングを調べますが、 – Milambardo

+0

コメントを残してください。ありがとう。 –