BETWEEN
devrait surpasser IN
dans ce cas (mais faites mesurer et vérifier aussi les plans d'exécution !), d'autant plus que n
grandit et que les statistiques sont toujours exactes. Supposons :
m
est la taille de votre tablen
est la taille de votre plage
L'index peut être utilisé (n
est minuscule par rapport à m
)
-
En théorie,
BETWEEN
peut être implémenté avec un seul "balayage de plage" (parole d'Oracle) sur l'index de clé primaire, puis traverse au plusn
indexer les nœuds feuilles. La complexité seraO(n + log m)
-
IN
est généralement implémenté comme une série (boucle) den
"range scans" sur l'index de clé primaire. Avecm
étant la taille de la table, la complexité sera toujoursO(n * log m)
... ce qui est toujours pire (négligeable pour les très petites tablesm
ou de très petites plagesn
)
L'index ne peut pas être utilisé (n
est une partie importante de m
)
Dans tous les cas, vous obtiendrez une analyse complète de la table et évaluerez le prédicat sur chaque ligne :
-
BETWEEN
doit évaluer deux prédicats :un pour la borne inférieure et un pour la borne supérieure. La complexité estO(m)
-
IN
doit évaluer au plusn
prédicats. La complexité estO(m * n)
... ce qui est toujours pire, ou peut-êtreO(m)
si la base de données peut optimiser leIN
liste pour être un hashmap, plutôt qu'une liste de prédicats.