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
の重要な部分です )
いずれの場合も、全表スキャンを取得して、各行の述語を評価します。
-
BETWEEN
2つの述語を評価する必要があります。1つは下限用、もう1つは上限用です。複雑さはO(m)
です -
IN
最大でn
を評価する必要があります 述語。複雑さはO(m * n)
です。 ...これも常に悪い、またはおそらくO(m)
データベースがIN
を最適化できるかどうか 述語のリストではなく、ハッシュマップになるようにリストします。