クエリのパフォーマンスが悪い


10

処理するデータ量に応じて、通常0.5〜6.0秒で実行される大きな(10,000行以上)手順があります。過去1か月間で、FULLSCANで統計を更新してから30秒以上かかりました。速度が低下すると、sp_recompileは問題を「修正」し、夜間統計ジョブが再度実行されるまで待機します。

低速と高速の実行プランを比較することで、特定のテーブル/インデックスに絞り込みました。実行速度が遅い場合は、特定のインデックスから約300行が返されると推定され、実行速度が速い場合は1行と推定されます。実行速度が遅い場合はインデックスでシークを行った後にテーブルスプールを使用し、実行速度が速い場合はテーブルスプールを実行しません。

DBSS SHOW_STATISTICSを使用して、インデックスヒストグラムをExcelでグラフ化しました。私は通常、グラフがより「ローリングヒル」であると予想しますが、代わりにそれは山のように見え、最高点はグラフ上の他のほとんどの値よりも2倍から3倍高くなります。

インデックスヒストグラム

FULLSCANなしで統計を更新すると、より正常に見えます。その後、もう一度FULLSCANで実行すると、上記のように見えます。

これは、パラメータスニッフィングの問題のように感じられ、特に上記の(一見)奇妙なインデックス分布に関連しています。

プロシージャはテーブル値パラメーターを受け取りますが、パラメーター値パラメーターでパラメーターのスニッフィングを行うことができますか?

編集:プロシージャは、他に12個のパラメーターも受け取ります。そのうちのいくつかはオプションで、そのうちの2つは開始日と終了日です。

ヒストグラムは奇妙ですか、それとも間違ったツリーを吠えていますか?

クエリを調整したり、インデックスを調整したりすることは確かに快適です。それがすばらしい修正である場合、その時点での私の質問は、歪んだヒストグラムについての詳細です。

これはPK IDENTITYクラスター化インデックスであることを述べておきます。互いに通信する2つのシステムがあり、1つはレガシーシステムで、もう1つは新しい自家製システムです。どちらのシステムも同様のデータを保存します。新しいシステムのこのテーブルのPKを同期させるために、古いシステムにデータが追加されない場合でも(RESEEDが実行された場合でも)、PKが増加します。したがって、この列の番号付けにいくつかのギャップがある可能性があります。レコードが削除されることはほとんどありません。

どんな考えでも大歓迎です。より多くの情報を収集/含めることができて、とてもうれしいです。


あるのみプロシージャにパラメータがTVPまたはそこに他のparamsは、あまりにもですか?
マーティンスミス

1
遅いプランと速いプランのXMLを見るとParameterCompiledValue、これらの他のパラメーターの違いによって違いが明らかになるでしょうか?
マーティン・スミス

1
コンパイルされた日付範囲は劇的に狭くなっています(31日ではなく5日)。ほとんどの呼び出しでは、このプロシージャは1か月間実行されます。その特定のステートメントに再コンパイルのヒントを追加してみることができます。
マークウィルキンソン

1
これは間違いなく、ID列の奇妙な分布のようです。私はこの記事を読んでいて、これらの2つの計画の見積もりと実際の比較で何が表示されているかを詳しく説明できるかどうか疑問に思っていましたか?> blogs.technet.com/b/mspfe/archive/2013/04/18/…–
リチャード

1
ただ明確にするために、正確には何のグラフですか?RANGE_HI_KEYおそらくx軸にありますが、y軸には何がありますか?EQ_ROWSRANGE_ROWS?それらの合計?
ポールホワイト9

回答:


3

これは、最終的にパラメータスニッフィングに関連しています。統計情報が再構築された直後に、このクエリの奇妙に形成されたバージョンが実行されていたのは偶然です。したがって、キャッシュされたプランは、大部分の呼び出しを表すものではありませんでした。日付パラメーターをローカル変数にコピーするトリックを使用しましたが、これは問題なく機能し、パフォーマンスへの影響はほとんどありません。これは、ヒストグラムが「オフ」に見える理由には答えませんが、パフォーマンスの問題を説明します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.