Ако приемем, че целта е максималната производителност, в идеалния случай бих избрал SUBSTR(my_field,1,6)
и създайте индекс, базиран на функции, за да поддържа заявката.
CREATE INDEX my_substr_idx
ON my_table( substr( my_field,1,6 ) );
Както посочват други, SUBSTR(my_field,1,6)
няма да може да използва обикновен индекс в MY_FIELD
. Версията LIKE може да използва индекса, но оценките за мощността на оптимизатора в този случай обикновено са доста лоши, така че е много вероятно или да не използва индекс, когато би бил полезен, или да използва индекс, когато сканирането на таблица би било за предпочитане. Индексирането на действителния израз ще даде на оптимизатора много повече информация, с която да работи, така че е много по-вероятно да избере индекса правилно. Някой по-умен от мен може да е в състояние да предложи начин за използване на статистически данни за виртуални колони в 11g, за да даде на оптимизатора по-добра информация за заявката LIKE.
Ако 6 е променлива (т.е. понякога искате да търсите в първите 6 знака, а понякога искате да търсите различно число), вероятно няма да можете да измислите индекс, базиран на функции, който да поддържа тази заявка. В такъв случай вероятно ще ви е по-добре с капризите на решенията на оптимизатора с формулировката LIKE.