BETWEEN
dovrebbe supera IN
in questo caso (ma fai misurare e controllare anche i piani di esecuzione!), in particolare come n
cresce e poiché le statistiche sono ancora accurate. Assumiamo:
m
è la dimensione del tuo tavolon
è la dimensione della tua gamma
È possibile utilizzare l'indice (n
è minuscolo rispetto a m
)
-
In teoria,
BETWEEN
può essere implementato con un singolo "range scan" (Oracle speak) sull'indice della chiave primaria, e quindi attraversare al massimon
nodi foglia indice. La complessità saràO(n + log m)
-
IN
è solitamente implementato come una serie (ciclo) din
"scansioni dell'intervallo" sull'indice della chiave primaria. Conm
essendo la dimensione della tabella, la complessità sarà sempreO(n * log m)
...che è sempre peggio (neglibile per tavoli molto piccolim
o intervalli molto piccolin
)
Impossibile utilizzare l'indice (n
è una parte significativa di m
)
In ogni caso, otterrai una scansione completa della tabella e valuterai il predicato su ogni riga:
-
BETWEEN
deve valutare due predicati:uno per il limite inferiore e uno per il limite superiore. La complessità èO(m)
-
IN
deve valutare al massimon
predicati. La complessità èO(m * n)
... che è sempre peggio, o forseO(m)
se il database può ottimizzare ilIN
list deve essere una hashmap, piuttosto che un elenco di predicati.