En supposant que la performance maximale est l'objectif, je choisirais idéalement SUBSTR(my_field,1,6)
et créez un index basé sur les fonctions pour prendre en charge la requête.
CREATE INDEX my_substr_idx
ON my_table( substr( my_field,1,6 ) );
Comme d'autres le soulignent, SUBSTR(my_field,1,6)
ne serait pas en mesure d'utiliser un index régulier sur MY_FIELD
. La version LIKE peut utiliser l'index, mais les estimations de cardinalité de l'optimiseur dans ce cas sont généralement plutôt médiocres, il est donc fort probable de ne pas utiliser d'index lorsque cela serait utile ou d'utiliser un index lorsqu'un balayage de table serait préférable. L'indexation de l'expression réelle donnera à l'optimiseur beaucoup plus d'informations avec lesquelles travailler, il est donc beaucoup plus susceptible de sélectionner l'index correctement. Quelqu'un de plus intelligent que moi pourra peut-être suggérer un moyen d'utiliser les statistiques sur les colonnes virtuelles dans 11g pour donner à l'optimiseur de meilleures informations pour la requête LIKE.
Si 6 est une variable (c'est-à-dire que vous souhaitez parfois rechercher les 6 premiers caractères et parfois rechercher un nombre différent), vous ne pourrez probablement pas trouver un index basé sur une fonction pour prendre en charge cette requête. Dans ce cas, vous êtes probablement mieux loti avec les aléas des décisions de l'optimiseur avec la formulation LIKE.