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:

  • 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.