Forudsat at maksimal ydeevne er målet, ville jeg ideelt set vælge SUBSTR(my_field,1,6)
og opret et funktionsbaseret indeks for at understøtte forespørgslen.
CREATE INDEX my_substr_idx
ON my_table( substr( my_field,1,6 ) );
Som andre påpeger, SUBSTR(my_field,1,6)
ville ikke være i stand til at bruge et almindeligt indeks på MY_FIELD
. LIKE-versionen kan muligvis bruge indekset, men optimizerens kardinalitetsestimater i det tilfælde er generelt ret dårlige, så det er ret sandsynligt, at du enten ikke bruger et indeks, når det ville være nyttigt, eller at bruge et indeks, når en tabelscanning ville være at foretrække. Indeksering af det faktiske udtryk vil give optimeringsværktøjet langt mere information at arbejde med, så det er meget mere sandsynligt, at indekset vælges korrekt. Nogen klogere end jeg er måske i stand til at foreslå en måde at bruge statistik på virtuelle kolonner i 11g for at give optimeringsværktøjet bedre information til LIKE-forespørgslen.
Hvis 6 er en variabel (dvs. du nogle gange ønsker at søge efter de første 6 tegn og nogle gange vil søge efter et andet tal), vil du sandsynligvis ikke være i stand til at finde et funktionsbaseret indeks til at understøtte denne forespørgsel. I så fald er du sikkert bedre stillet med lunhederne i optimizerens beslutninger med LIKE-formuleringen.