問題は、クエリ内の別々のテーブルに適用されるORを使用して2つの条件を指定していることです。このため、非クラスター化インデックスシークは、大きなテーブルのほとんどまたはすべての行を返す必要があります。これは、ORロジックにより、2番目のテーブルの条件句にも一致する可能性があるためです。
上記の3つの例すべてのSQL実行プランを見て、非クラスター化インデックスから出てくる行の数が大きなテーブルからシークしていることに注目してください。最終的な結果は、テーブル内の800,000行のうち1,000行以下しか返さない可能性がありますが、OR句は、そのテーブルの内容を2番目のテーブルの条件と相互参照する必要があることを意味します。これは、ORが最終的に必要になる可能性があることを意味します。クエリ出力。
実行プランによっては、インデックスシークが2番目のテーブルのOR句の条件にも一致する可能性があるため、大きなテーブルの800,000行すべてを引き出す場合があります。 UNION ALLは、それぞれ1つのテーブルに対する2つの別個のクエリであるため、インデックスシークは、そのクエリの条件に一致する可能性のある小さい結果セットを出力するだけで済みます。
これが理にかなっていることを願っています。実行速度の遅いSQLステートメントをリファクタリングしているときに同じ状況に遭遇しました。
乾杯、
アンドレ・ラニエリ