BETWEEN すべき INよりも優れています この場合(ただし、実行 実行計画も測定して確認してください!)、特にnとして 成長し、統計がまだ正確であるように。仮定しましょう:
-
mテーブルのサイズです -
n範囲のサイズです
インデックスを使用できます(n mに比べて小さいです )
-
理論的には、
BETWEEN主キーインデックスで単一の「範囲スキャン」(Oracleスピーク)を使用して実装し、最大でnをトラバースできます。 インデックスリーフノード。複雑さはO(n + log m)になります -
IN通常、一連のnとして実装されます 主キーインデックスの「範囲スキャン」。mを使用 テーブルのサイズであるため、複雑さは常にO(n * log m)になります。 ...これは常に悪いことです(非常に小さなテーブルの場合は無視できますmまたは非常に狭い範囲n)
インデックスは使用できません(n mの重要な部分です )
いずれの場合も、全表スキャンを取得して、各行の述語を評価します。
-
BETWEEN2つの述語を評価する必要があります。1つは下限用、もう1つは上限用です。複雑さはO(m)です -
IN最大でnを評価する必要があります 述語。複雑さはO(m * n)です。 ...これも常に悪い、またはおそらくO(m)データベースがINを最適化できるかどうか 述語のリストではなく、ハッシュマップになるようにリストします。