Cómo optimizar al máximo el uso de índices en las consultas con LIKE, tanto en Oracle como en SQL Server
Este pequeño truco es válido para Oracle y para SQL Server, y aunque no lo he podido probar, seguramente para cualquier otro motor de bases de datos.
La teoría, es que siempre que utilizas un LIKE en una consulta, se hará un Fullscan, no haciendo uso de los índices excepto que sólo se esté usando el comodín a la derecha. Si miramos el plan de ejecución de las siguientes consultas, veremos que la primera hace un uso del índice mientras la segunda no:
SELECT telefono FROM agenda WHERE nombre LIKE 'Javi%' SELECT telefono FROM agenda WHERE nombre LIKE '%Sánchez'
La solución para que en ambos casos se utilicen los índices es bien sencilla, y estará en nuestra mano evaluar si se hacen el número suficiente de consultas del segundo tipo como para implementarla. Los pasos:
Espero que os haya sido útil.
SELECT telefono FROM agenda WHERE nombre LIKE 'Javi%' SELECT telefono FROM agenda WHERE nombre LIKE '%Sánchez'
La solución para que en ambos casos se utilicen los índices es bien sencilla, y estará en nuestra mano evaluar si se hacen el número suficiente de consultas del segundo tipo como para implementarla. Los pasos:
- Crearemos un nuevo campo en la tabla "agenda" con el nombre "nombrerev".
- Rellenamos "nombrerev" con los datos en reverse de nombre, haciendo uso de la función REVERSE, disponible tanto Oracle como SQL Server -REVERSE(nombre)- y creamos un nuevo índice en "nombrerev".
- Creamos triggers para que cuando haya INSERT o UPDATE en "nombre", nos actualice "nombrerev".
- En la aplicación, debemos realizar un pequeño ajuste, que detecte cuando se va a ejecutar una consulta con el comodín al principio: SELECT telefono FROM agenda WHERE nombre LIKE '%Sánchez', para que la cambie a SELECT telefono FROM agenda WHERE nombrerev LIKE REVERSE('%Sánchez')
Espero que os haya sido útil.