BETWEEN
harus mengungguli IN
dalam hal ini (tetapi lakukan ukur dan periksa juga rencana eksekusi!), terutama sebagai n
tumbuh dan sebagai statistik masih akurat. Mari kita asumsikan:
m
adalah ukuran meja Andan
adalah ukuran jangkauan Anda
Indeks dapat digunakan (n
kecil dibandingkan dengan m
)
-
Secara teori,
BETWEEN
dapat diimplementasikan dengan satu "pemindaian rentang" (Oracle berbicara) pada indeks kunci utama, dan kemudian melintasi paling banyakn
simpul daun indeks. Kompleksitasnya adalahO(n + log m)
-
IN
biasanya diimplementasikan sebagai rangkaian (loop) darin
"range scan" pada indeks kunci utama. Denganm
menjadi ukuran tabel, kompleksitas akan selaluO(n * log m)
... yang selalu lebih buruk (diabaikan untuk tabel yang sangat kecilm
atau rentang yang sangat keciln
)
Indeks tidak dapat digunakan (n
adalah bagian penting dari m
)
Bagaimanapun, Anda akan mendapatkan pemindaian tabel lengkap dan mengevaluasi predikat pada setiap baris:
-
BETWEEN
perlu mengevaluasi dua predikat:Satu untuk batas bawah dan satu untuk batas atas. Kompleksitasnya adalahO(m)
-
IN
perlu mengevaluasi paling banyakn
predikat. Kompleksitasnya adalahO(m * n)
... yang lagi-lagi selalu lebih buruk, atau mungkinO(m)
jika database dapat mengoptimalkanIN
list menjadi hashmap, bukan daftar predikat.