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 :
mest la taille de votre tablenest la taille de votre plage
L'index peut être utilisé (n est minuscule par rapport à m )
-
En théorie,
BETWEENpeut être implémenté avec un seul "balayage de plage" (parole d'Oracle) sur l'index de clé primaire, puis traverse au plusnindexer les nœuds feuilles. La complexité seraO(n + log m) -
INest 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 tablesmou 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 :
-
BETWEENdoit évaluer deux prédicats :un pour la borne inférieure et un pour la borne supérieure. La complexité estO(m) -
INdoit évaluer au plusnprédicats. La complexité estO(m * n)... ce qui est toujours pire, ou peut-êtreO(m)si la base de données peut optimiser leINliste pour être un hashmap, plutôt qu'une liste de prédicats.