Ya teneis que estar cansados de mis despotriques de mi trabajo, pero siempre suelen ser por mis compañeros (ayer de hecho me tuve que tragar una bronca y disculparme cuando no era cosa mía, vine cabreada). Pero es que el propio trabajo a veces me hace tirarme de los pelos, y esta vez tengo un buen ejemplo.

No me voy a mojar mucho detallando porque sería fácil que encontraran este blog (suficiente es que se vea mi careto por alguna parte), así que diré que programando tengo que hacer selects, dentro de un lenguaje, y que éstas se traducen por un driver a la sintaxis de Oracle. Es una compañía grande, así que me encuentro con tablas de millones de registros fácilmente, alguna hasta con más de 100 campos, de modo que hay que procurar hacer las cosas de forma óptima.

Hoy, pues nada, haciendo una consulta sobre una tabla de casi 1 millón de registros. Como no hay índice para la consulta que tengo que hacer, sugiero la idea, y se me acepta. Tan chula yo, voy y escribo más o menos esto:

select tablita.*
from tablita
where tablita.indice15=(tal,pascual)
and blablabla…

indice15 para mi siempre ha sido que utilizo el índice 15, es decir el que acababa de crear. Lo presento, y me dicen que eso no es óptimo, que no estoy utilizando el índice ¿WTF? Vale, por una parte entiendo que en el fondo, .indice15 en realidad es un campo combinado, un campo oculto de la tabla que es la concatenación de tal y de pascual. Pero si así no usa el índice, ¿entonces qué hace? Pues por defecto Oracle hará uso del índice que le digan de las estadísticas, o bien del índice 1, la clave primaria.

¡Y dónde leñes le digo que no quiero que haga lo que le de la gana! Pues la solución me ha dado ganas de estrangular a todos los indios programadores: añadiendo,

order by tablita.indice15

¿¡QUÉ!? ¡Order es para ordenar! Para mi siempre el order by se ha ejecutado después de tener en memoria todos los resultados de la select. Pues aquí no, aquí si lo pones estás obligando a la base de datos a usar ese índice. Me dan ganas de pegarme un tiro con cosas como estas, porque no es algo que puedas deducir, ¡se lo sacan de la manga! Y tampoco tengo acceso a ver la traza de las selects en Oracle, no se fían de mi T.T así que solo puedo saber si estoy haciendo una select mejor o peor, a ojo de buen cubero.

Lo que más rabia me da es enterarme de cosas como esta cuando llevo ya un año programando.

Y escribiendo esto, me viene una pregunta. Si quiero obligar a que la select utilice ese índice, pero yo quiero los resultados ordenados por otra cosa, ¿qué? ¿Ajo y agua? ¡Ja!