5

今日もまた、SQL Server 2005 でのパラメータ スニッフィングと思われる重大な問題が発生しました。

いくつかの結果を既知の良好な結果と比較するクエリがあります。結果と既知の良好な結果に列を追加して、毎月新しい月の結果を両側に読み込んで、現在の月のみを比較できるようにしました。新しい列はクラスター化インデックスの最初にあるため、新しい月が最後に追加されます。

句に基準を追加します。WHEREこれはコード生成されるため、リテラル定数です。

WHERE DATA_DT_ID = 20081231-- 現在、すべての DATA_DT_ID が 20081231 であるため、これは冗長です。

パフォーマンスはポットに行きます。約 150 万行を比較するのに 7 秒から 2 時間かかり、何も完了しません。生成された SQL を SSMS で正しく実行する - SP なし。

私は SQL Server を 12 年間使用してきましたが、10 月以降、この運用サーバー (ビルド ビルド 9.00.3068.00) で経験したように、パラメーター スニッフィングでこれほど多くの問題が発生したことはありません。いずれの場合も、最初に別のパラメーターを指定して実行したか、テーブルを変更したためではありません。これは新しいテーブルであり、このパラメーターを使用してのみ実行されるか、WHERE句がまったく使用されません。

いいえ、私には DBA アクセス権がなく、実行計画を表示するための十分な権限が与えられていません。

ほんの数年の経験しかない SQL Server ユーザーにこのシステムを処理できるかどうか確信が持てないところまで来ています。

UPDATE統計は最新であると主張していますが、UPDATE STATISTICS WITH FULLSCAN を実行すると問題が解消されることがわかりました。

FINAL UPDATE WITH RECOMPILE と UPDATE STATISTICS を使用して SP を再作成しても、NULL チェック付きの LEFT JOIN の代わりに NOT IN を使用するようにクエリを別の方法で書き直す必要があることがわかりました。

4

4 に答える 4

6

答えにはなりませんが、私の経験をお話しします。

パラメータ スニッフィングは、主に DBA の本番環境の仕事に移った後、開発者 DBA に戻ったとき、SQL Server の数年をかけて私を悩ませました。エンジン、SQL の仕組み、クライアントに任せるのが最善の方法などについて理解が深まり、より優れた SQL コーダーになりました。

たとえば、動的な SQL や CURSOR、または単純に不適切な SQL コードは、おそらくパラメーター スニッフィングを受けることはありません。ただし、プログラミングを設定するか、動的 SQL またはより洗練された SQL を回避する方法を使用する可能性が高くなります。

複雑な検索コード (多数の条件) と、パラメーターの既定値が計画に影響を与える複雑なレポートで、これに気付きました。経験の浅い開発者がこのコードを作成する様子を見ると、パラメーター スニッフィングに苦しむことはありません。

いずれにせよ、WITH RECOMPILE よりもパラメーター マスキングを好みます。統計またはインデックスを更新すると、とにかく再コンパイルが強制されます。しかし、なぜいつも再コンパイルするのでしょうか? コンパイル中にパラメーターが盗聴されることに言及しているリンクを使用して、あなたの質問の1つに別の場所で答えたので、私もそれを信じていません。

パラメーターのマスキングはオーバーヘッドですが、オプティマイザーは一括再コンパイルではなく、ケースごとにクエリを評価できます。特に SQL Server 2005 のステートメント レベルの再コンパイルでは

SQL Server 2008 の OPTIMIZE FOR UNKNOWN も、マスキングとまったく同じことを行うようです。SQL Server MVP の同僚と私は調査に時間を費やし、この結論に達しました。

于 2009-12-05T10:04:52.623 に答える
4

あなたの問題はデータ統計が不足していることが原因だと思います。サーバーへのDBAアクセス権がないため、統計が最後に更新されたのはいつかをDBAに確認することをお勧めします。これはパフォーマンスに大きな影響を与える可能性があります。また、テーブルのインデックスが適切に作成されていないようです。

基本的に、これはパラメータスニッフィングの問題のように「感じる」のではなく、「健全な」データベースの問題のように感じます。

この記事では、統計が最後に更新された時刻を判別する方法について説明します。 統計更新時刻

于 2009-01-21T23:59:11.367 に答える