planes de ejecucion

juanin
13 de Marzo del 2005
Buenas,
hace poco que trabajo con SQL Server y no lo controlo del todo. El caso es que ayer comprobé como puede cambiar el rendimiento de una consulta de comparar las condiciones del where con valores directamente a compararlas con esos mismos valores almacenados en variables. Ej
1.
WHERE fecha_inicio BETWEEN convert(datetime,'11/03/2005',103) AND convert(datetime,'12/03/2005',103)
y 2.
WHERE fecha_inicio BETWEEN @ayer AND @hoy

Se trataba de una consulta bastante compleja con muchas tablas ligadas, con agregados y además con bastantes registros. Estaba teniendo problemas de timeout con ella y me di cuenta de que con sólo cambiar los parametros que le pasaba por valores concretos pasé de tardar más de 60 s. en el caso 2. a tardar 7 s. en el caso 1.
Tiré por el camino de en medio y monté la consulta dinámicamente en un varchar y se la pasé al EXEC, con lo que se solucionó.

Pero después he estado mirándo los planes de ejecución de las 2 versiones y he visto que no se parecen mucho, y es por ahi por donde venia el problema. La versión 2 pasaba de los índices y hacía todos los join utilizando HASH, por lo que se ralentiza todo mucho.
En la ayuda del TRANSACT SQL he visto que se habla de los hints, que parece que serían de utilidad en estos casos, pero no me queda nada claro como usarlos. Además en la ayuda directamente se desaconseja utilizarlosya que el planificador utiliza lo más adecuado.
Ahora que he comprobado que no siempre es asi, alguien me puede proponer un enlace interesante sobre el tema o explicarme algo de modo sencillo. También agradecería algun ejemplo practico sobre como utilizarlos.

Gracias de antemano y disculpen el rollo