RECOMPILEクエリヒントを使用する場合のクエリ間の実行時間の著しい違い


16

同じSQL Server 2005インスタンスで2つのほぼ同一のクエリを実行しています。

  1. 最初のSELECTクエリは、LINQによって生成された元のクエリです(私は知っています、私は知っています...私はアプリケーション開発者ではなく、DBAです:)。
  2. 2番目のものは最初のものとまったく同じOPTION (RECOMPILE)で、最後にaが追加されています。

他に変更はありません。

最初のものは、実行のたびに55秒かかります。
2番目は2秒かかります。

両方の結果セットは同じです。

このヒントがパフォーマンスの劇的な向上をもたらすのはなぜですか?

Books OnlineのエントリにRECOMPILEは、あまり詳細な説明はありません。

クエリの実行後にクエリに対して生成されたプランを破棄するようにSQL Serverデータベースエンジンに指示し、同じクエリが次に実行されるときにクエリオプティマイザにクエリプランを再コンパイルさせます。RECOMPILEを指定しないと、データベースエンジンはクエリプランをキャッシュし、それらを再利用します。クエリプランをコンパイルするとき、RECOMPILEクエリヒントは、クエリ内のローカル変数の現在の値を使用し、クエリがストアドプロシージャ内にある場合、現在の値をパラメータに渡します。

RECOMPILEは、ストアドプロシージャ全体ではなく、ストアドプロシージャ内のクエリのサブセットのみを再コンパイルする必要がある場合に、WITH RECOMPILE句を使用するストアドプロシージャを作成するための便利な代替手段です。詳細については、「ストアドプロシージャの再コンパイル」を参照してください。RECOMPILEは、プランガイドを作成するときにも役立ちます。詳細については、「プランガイドを使用したデプロイ済みアプリケーションでのクエリの最適化」を参照してください。

クエリには多くのローカル変数があるため、OPTION (RECOMPILE)クエリヒントを使用すると、SQL Serverは(真剣に)最適化できると推測されます。

私が見ているところはどこでも、それOPTION (RECOMPILE)は避けるべきだと言っている。この説明は、一般に、このヒントを使用すると、SQL Serverはこの実行計画を再利用できないため、毎回再コンパイルする時間を無駄にする必要があるというものです。
(しかし)パフォーマンスが非常に優れていることを考えると、今回はこのクエリヒントを使用するのは良いことだと思います。

使用すべきですか?そうでない場合、このヒントとアプリケーションを変更せずに、SQL Serverにより良い実行計画を使用させることができますか?

回答:


16

Microsoft SQL Server 2005のクエリオプティマイザーで使用される統計記事に記載されているとおり

パラメーターまたはリテラルの代わりにクエリ述語でローカル変数を使用する場合、オプティマイザーは低品質の見積もり、または述語の選択性の推測に頼ります。クエリでは、ローカル変数の代わりにパラメーターまたはリテラルを使用します

オプティマイザーが列に対して使用可能な統計をまったく持たない場合、述部は行の10%、9%、およびいずれかが30%に一致すると推測します。利用可能な列統計がある場合、述部は以下のように異なる方法で処理されます。=BETWEEN>, >=, < and <==

クエリでローカル変数が使用されている場合でも、等値述語の場合、推測よりも優れた推定値が使用されます。「@local_variable = column_name」形式の条件の選択性は、column_nameのヒストグラムの平均値頻度を使用して推定されます。したがって、たとえば、列column_nameにすべての一意の値が含まれる場合、選択性の推定値1/(number of unique values in column)が使用されますが、これは正確です。

したがって、これはforを使用するのと本質的に同じですOPTIMIZE FOR (UNKNOWN)。フラットな10%推測よりも正確かもしれませんが、クエリしている特定の値に合わせて調整されていません。

SQL Serverが実行されるたびにクエリを最適化し、ローカル変数の値を使用してクエリの最適化中にカーディナリティとコストを推定するには、RECOMPILEクエリにクエリヒントを追加します。

RECOMPILEあなたを使用すると、おそらくより正確なカーディナリティの見積もりが得られるため、実際のクエリのさまざまな部分から返される行の数により適した、結合順序/結合タイプの異なるプランが得られます。

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