Zakładając, że celem jest maksymalna wydajność, idealnie wybrałbym SUBSTR(my_field,1,6)
i utwórz indeks oparty na funkcjach do obsługi zapytania.
CREATE INDEX my_substr_idx
ON my_table( substr( my_field,1,6 ) );
Jak wskazują inni, SUBSTR(my_field,1,6)
nie byłby w stanie użyć zwykłego indeksu w MY_FIELD
. Wersja LIKE może korzystać z indeksu, ale w takim przypadku oszacowania kardynalności optymalizatora są na ogół raczej słabe, więc jest całkiem prawdopodobne, że albo nie użyje się indeksu, gdy będzie to pomocne, albo użyje indeksu, gdy skanowanie tabeli będzie preferowane. Indeksowanie rzeczywistego wyrażenia zapewni optymalizatorowi znacznie więcej informacji, z którymi może pracować, więc jest znacznie bardziej prawdopodobne, że poprawnie wybierze indeks. Ktoś mądrzejszy ode mnie może zasugerować sposób wykorzystania statystyk wirtualnych kolumn w 11g, aby zapewnić optymalizatorowi lepsze informacje dla zapytania LIKE.
Jeśli 6 jest zmienną (tzn. czasami chcesz przeszukać pierwsze 6 znaków, a czasami inną liczbę), prawdopodobnie nie będziesz w stanie wymyślić indeksu opartego na funkcji do obsługi tego zapytania. W takim przypadku prawdopodobnie lepiej poradzisz sobie z kaprysami decyzji optymalizatora z formułą LIKE.