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,
BETWEENpuò essere implementato con un singolo "range scan" (Oracle speak) sull'indice della chiave primaria, e quindi attraversare al massimonnodi 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. Conmessendo la dimensione della tabella, la complessità sarà sempreO(n * log m)...che è sempre peggio (neglibile per tavoli molto piccolimo 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:
-
BETWEENdeve valutare due predicati:uno per il limite inferiore e uno per il limite superiore. La complessità èO(m) -
INdeve valutare al massimonpredicati. La complessità èO(m * n)... che è sempre peggio, o forseO(m)se il database può ottimizzare ilINlist deve essere una hashmap, piuttosto che un elenco di predicati.