Oracle ofrece la posibilidad de crear √≠ndices basados en funciones. Esto ha sido muy √ļtil en mi caso particular, en el que el desarrollador necesita que sea posible buscar por los 3 primeros caracteres de una columna de art√≠culos.

La tabla llamémosla PRODUCT y el campo con los nombres de artículos NAME:

CREATE INDEX product_name_sub_idx ON product substr(name,1,3)

Importante: El par√°metro QUERY_REWRITE_ENABLED debe estar establecido en TRUE.


Lo que antes era un costoso LIKE:
    select name from product where name like 'MUE%';
ahora podría ser un igual:
    select name from product where substr(name,1,3) = 'MUE';

Esto seg√ļn la documentaci√≥n, porque algo sorprendente, o al menos inesperado por m√≠ tras observar los planes de ejecuci√≥n, es que con el operador LIKE, Oracle tambi√©n hace uso del nuevo √≠ndice, incluso si la b√ļsqueda sobrepasa el n√ļmero de caracteres indicados en la funci√≥n aprovecha el √≠ndice, por ejemplo:

select name from product where name like 'MUESLI%';

En este  caso, la tabla tiene medio mill√≥n de registros y la misma consulta ha pasado de tardar unos 8 segundos a menos de 200 ms.