時間の経過に伴う一貫したクエリパフォーマンス



Consistent Query Performance Over Time



解決:

最初に、その統計情報か、それともパラメータスニッフィングがあなたを傷つけているかどうかを判断することをお勧めします。

上記に関係なく、このテーマに関するアーランドの記事を読むことをお勧めします。



それについて何をすべきかを言うのは難しいです。それが統計なのかスニッフィングなのかはわかりません。

しかし、おそらく追加OPTIMIZEFORは「」ソリューションになります。それよりも安いです実行ごとに計画の本番ヒットを取得する必要がないため、再コンパイルします。そしてそれはあなたに予測可能性を与えます。もちろん、これは、統計がそれほど異なる場合がないことを前提としているため、統計上の理由により、同じパラメーター入力で異なる計画が生成されます。



1つのクエリを特定してみてください。クエリの計画が1つまたは複数あるかどうかを確認します。でテストする最適化および/または再コンパイルします。データベース規模での「グローバル」オプションの1つは、データベースのパラメータースニッフィングを無効にすることです。これは、値の手がかりがないため、オプティマイザーが最適化することを意味します。アーランドの記事には、これ以上のものがあります。

パラメータスニッフィングは、ストアドプロシージャだけに適用されるわけではありません。また、パラメータ化されたSQLにも適用されます(通常、sp_executesql)。これは、今日ではストアドプロシージャよりもはるかに一般的である可能性があります。


コメントから生成された回答



統計の更新後に取得した統計が間違っているため、間違ったクエリプランを取得する可能性があります。ただし、統計を更新した後、クエリが取得した最初のパラメータが通常とは異なる場合、パラメータがスニッフィングするため、間違ったクエリプランを取得する可能性もあります。あなたの質問から、どの問題が提示されているかを理解することは不可能です。統計を更新して2つの異なる問題を分割するのではなく、クエリが悪化したときにクエリプランを再コンパイルしてみてください。 –デニス・ルバシュキン

実行プランの「再構築」を引き起こす可能性のある多くの要因があります。それで、それはなぜそれがしばらくの間うまく働き、突然遅く働き始めるのかを説明するでしょう。統計を更新すると、このオブジェクトに関係するすべての実行プランが無効になり、次の実行で新しいプランが作成されます。使用する値に応じて、問題が修正される場合と修正されない場合があります(ほとんどの値は修正されますが、他の値は修正されないため、機能する場合と機能しない場合があります)。

実行プランを「修正」する別の方法は、クエリストア(SQL Server 2016から始まったと思います)を使用し、使用するプランを「修正」することです。データが大幅に変更されると(SQL Serverはより良いプランを作成できないため)、いくつかの欠点がありますが、そのような問題を修正することはできます(2年前から修正実行プランでクエリを実行していて、以来、パラメータスニッフィングの問題はありません)。 –ドミニクブーシェ