私はこのようになりますクエリがあります。悪いのパフォーマンスOR条件
SELECT *
FROM A
INNER JOIN B ON A.AId = B.AId
WHERE A.ADate BETWEEN @Start and @End
or B.BDate BETWEEN @Start and @End
両方のテーブルAとBが同じサイズであると行がたくさんあるし。実行プランは、インデックスシークを示していますが、インデックス全体をスキャンしているようです。
or
をand
に変更すると、クエリが非常に高速になります。これは、or
を計算するために両方のテーブルでテーブルスキャンを実行しなければ、or
の結果を知ることができないためです。 and
は簡単に2つの操作に分割されます。
私は、or
の代わりにUNION
を使用することが可能であると述べていますが、ORの両方の条件が真である場合に重複する行が導入される可能性があります。
私は結合のサイズを減らし、両方のテーブルの完全な結合を防ぐことができるので、どのような解決方法がありますか?私はクエリを再構築することは可能ですが、この作業を行うことは可能ですが、クエリーのロジックが必要です(範囲内の日付または範囲内の日付と一致する項目を与えてください)。
UNIONについての訂正をありがとう、私はそれを試してみます。私は少し重複していないことを確実にするために別個の並べ替えを心配していますが、それは私が見ている "または"の動作よりも速いかもしれません。 – Kekoa
確かに。それがうまくいかない場合は、Mike Parkhillのアプローチに刺すようにしてください。 –