Estoy desarrollando un sistema que periódicamente (4-5 veces al día) ejecuta una instrucción select, que normalmente toma menos de 10 segundos, pero que periódicamente toma hasta 40 minutos.Pregunta lenta intermitente en SQL Server 2008
La base de datos está en Windows Server 2008 + SQL Server 2008 R2; ambos 64 bits.
Hay un servicio en la máquina que ejecuta la base de datos que sondea la base de datos y genera valores para los registros que lo requieren. Estos registros se consultan periódicamente utilizando una selección de combinación de varias tablas de un servicio en una segunda máquina escrita en C++ (VS 2010) utilizando la clase CRecordset de MFC para extraer los datos. A continuación, se muestra un ejemplo de la consulta que causa el problema.
SELECT DISTINCT "JobKeysFrom"."Key" AS "KeyFrom","KeysFrom"."ID" AS "IDFrom",
"KeysFrom"."X" AS "XFrom","KeysFrom"."Y" AS "YFrom","JobKeysTo"."Key" AS "KeyTo",
"KeysTo"."ID" AS "IDTo","KeysTo"."X" AS "XTo","KeysTo"."Y" AS "YTo",
"Matrix"."TimeInSeconds","Matrix"."DistanceInMetres","Matrix"."Calculated"
FROM "JobKeys" AS "JobKeysFrom"
INNER JOIN "JobKeys" AS "JobKeysTo" ON
("JobKeysFrom"."Key"<>"JobKeysTo"."Key") AND
("JobKeysFrom"."JobID"=531) AND
("JobKeysTo"."JobID"=531)
INNER JOIN "Keys" AS "KeysFrom" ON
("JobKeysFrom"."Key"="KeysFrom"."Key") AND ("JobKeysFrom"."Status"=4)
INNER JOIN "Keys" AS "KeysTo" ON
("JobKeysTo"."Key"="KeysTo"."Key") AND ("JobKeysTo"."Status"=4)
INNER JOIN "Matrix" AS "Matrix" ON
("Matrix"."IDFrom"="KeysFrom"."ID") AND ("Matrix"."IDTo"="KeysTo"."ID")
ORDER BY "JobKeysFrom"."Key","JobKeysTo"."Key"
He intentado el siguiente
- comprobado los índices y todos parecen correctos y que están activos y están siendo utilizados de acuerdo con la consulta
- el asesor de diseño regresa con ninguna sugerencia
- He intentado desfragmentar los índices y los datos
- he reconstruido la base de datos desde cero exportando los datos y volviéndolos a importar en una nueva base de datos.
- ejecutó el generador de perfiles y encontró que cuando sale mal parece que hace muchos millones (hasta 100 millones) de lecturas en lugar de unos pocos cientos de miles.
- corrieron la base de datos en un servidor diferente
Durante el tiempo que se está ejecutando la consulta, puedo correr exactamente la misma consulta en la ventana del estudio de gestión y será volver a correr en 10 segundos. El problema no parece estar relacionado con el bloqueo, el interbloqueo, la CPU, el disco o la memoria, tal como lo ha hecho cuando el equipo que ejecutaba la base de datos solo ejecutaba esta única consulta. El servidor tiene 4 procesadores y 16 gb de memoria para ejecutarlo. También intenté actualizar los discos a otros mucho más rápidos y esto no tuvo ningún efecto.
Me parece que es casi como si la base de datos recibe la consulta, comienza a procesarla y luego se va a dormir durante 40 minutos o ejecuta la consulta sin usar los índices.
Cuando pasa mucho tiempo, con el tiempo terminará y enviará los resultados de la consulta (normalmente unos 70-100000 registros) de vuelta a la aplicación de llamada.
Cualquier ayuda o sugerencia será recibida con gratitud, muchas gracias
¿Se ejecuta esta consulta como un procedimiento almacenado parametrizado? –
¿Se puede evitar SELECT DISTINCT? Esto puede dañar el rendimiento de forma vertiginosa. –
@Yves: parece que es lo suficientemente eficiente como para ejecutar Adhoc y vuelve en 10 segundos. –