Tengo un procedimiento almacenado bastante complejo (o feo según cómo lo mire) que se ejecuta en SQL Server 2008. Basa una gran parte de la lógica en una vista que tiene una tabla pk y una tabla fk. La tabla fk se deja unir a la tabla pk un poco más de 30 veces (la tabla fk tiene un diseño pobre; utiliza pares de valores de nombre que necesito aplanar. Desafortunadamente, es de terceros y no puedo cambiarlo).La generación del plan de consulta SQL tarda 5 minutos, la consulta misma se ejecuta en milisegundos. ¿Que pasa?
De todos modos, había estado funcionando bien durante semanas hasta que periódicamente noté una carrera que tomaría 3-5 minutos. Resulta que este es el tiempo que lleva generar el plan de consulta. Una vez que el plan de consulta existe y se almacena en caché, el procedimiento almacenado se ejecuta de manera muy eficiente. Las cosas funcionan sin problemas hasta que haya una razón para regenerar y almacenar en caché el plan de consulta nuevamente.
¿Alguien ha visto esto? ¿Por qué lleva tanto tiempo generar el plan? ¿Hay formas de hacer que surja un plan más rápido?
Esto también vale la pena. Aunque he probado PIVOT y algunos CTE y hasta ahora la izquierda se une como una vista, ha sido la más eficiente. ¿Has visto de esta manera ser más rápido antes? – TheEmirOfGroofunkistan
Sí. Tenía la misma lógica (múltiples (alrededor de 20) combinaciones a la izquierda de "tabla-fk" a una "tabla maestra"), y el tiempo de ejecución aumentó drásticamente después de agregar otra combinación de la misma tabla. Reescribir esa selección de uno gigante a uno de dos pasos realmente ayudó. Pero tal vez fue solo un caso particular de índices desafortunados, no fui a cavar. (Y lo siento, perdí la frase "en una vista" en tu publicación) –
np: la vista simplemente simplifica la reutilización de la consulta, no estoy seguro de que sea necesaria. – TheEmirOfGroofunkistan