3

そのため、10年前のシステムで.net 3.5 Webフロントエンドを使用して、大規模なデータベース(30ギガ)のSQL2005を使用しています。新旧のビットがあります

私たちはますます頻繁に起こっている問題を抱えています。

ストアドプロシージャ(これまでに4つの異なるプロシージャがあります)は、タイムアウトすることを決定します。呼び出しはウェブサーバーから発生しており、30秒のタイムアウトに達し、エラーログに記録されます。Webサイトはシングルログインを使用します(これが間違っていることはわかっていますが、レガシーコードのために変更できません)。

この直後、まったく同じ呼び出しを実行し、(私としてログインして)1秒かかります。

この問題は、ドロップして再作成し、タイムアウトの負荷がかかるまで、この1つのストアドプロシージャに残ります。各sp呼び出しには、異なるパラメーターがあります。現在のユーザーに関連するすべての符号なしシフトを取得する場合と同様に、現在のユーザーはパラメーターとして渡されます

解決策は機能しますが、その理由はよくわかりません。

リリースサイクルは2週間で、このエラーはその間いつでも発生します。これは、リリースの翌日、リリースの1週間後に発生し、最後の1つはリリースの12日後です。

各リリースでSQLマルチスクリプトを実行し、ストアドプロシージャ/トリガー/関数/ビューをすべて削除して再作成します。

私が考えることができるのは、ストアドプロシージャの実行プランが破損しているか、間違っていると考えられることです。再作成をドロップすると、これがクリアされます。

sps WITH RECOMPILEオプションを呼び出すことを考えていますが、これはノーノーですか?または許容できる方法

4

3 に答える 3

3

これは、私が何度も見た問題のように聞こえます。ストアドプロシージャプランがプランキャッシュからフラッシュされ、次にプロシージャが実行されると、渡されたパラメータがプランになります。おそらくそのパラメータのセットには最適ですが、他の組み合わせではひどく機能します。

'オプションの'パラメータがある場合-NULLまたは値が渡される可能性があり、これに対処するために句で使用ORしているWHERE場合、通常、この種の問題が発生します。

WITH RECOMPILEを使用すると、毎回多くのCPUがプランをコンパイルする可能性があります。ストアドプロシージャが頻繁に呼び出されると、サーバーの一般的なパフォーマンスに簡単に影響を与える可能性があります。計画は別の問題です。

一般に、クエリを書き直してみることをお勧めしますOR。sを使用してさまざまなパラメータのセットを処理している場合は、動的SQL(パラメータとともにsp_executesqlを使用して正しい方法で実行)が大いに役立ちます。

PS実行時にストアドプロシージャが正常に機能することについて-私もこれを見ました-別の計画が生成されることになると思います-私の疑いは常に実行されていることです。たとえば、SSMSではわずかに異なるSETオプションのセットが有効になっています(私のインスタンスでは).Net-このインスタンスではプランが個別にキャッシュされます。誰かがこれが起こるかもしれないことを確認することができればそれはありがたいです!

于 2011-06-26T23:24:11.423 に答える
0

クリーンアップされていないある種のロック/トランザクションロジックを実行していない限り、これを直接引き起こしているのはストアドプロシージャではないかと思います。それでも、ドロップ/再作成がこれにどのように影響するかはわかりません。私はおそらく、SPが使用しているデータを調べ、プロファイリングを使用してこの実行パスを追跡し、パフォーマンスを改善できるかどうかを確認しようとします。

于 2011-06-26T23:18:41.320 に答える
0

これは、特定のプロシージャに保存されている実行プランが正しくないことが原因である可能性があります。

問題(単純化)は、SQLサーバーが渡されたパラメーターに基づいて実行プランの使用を最適化しようとすることです。これにより、場合によっては恐ろしいパフォーマンスが発生する可能性があります。

それをさらに説明するためにいくつかの読書があります。

http://blogs.msdn.com/b/queryoptteam/archive/2006/03/31/565991.aspx
http://elegantcode.com/2008/05/17/sql-parameter-sniffing-and-what-to -do-about-it /

明るい面としては、procで渡されたパラメーターをローカル変数にコピーすることで修正するのは非常に簡単です。

于 2011-06-26T23:29:46.197 に答える