Pregunta

He visto en Oracle 10g una función que calcula el tiempo restante para una consulta de larga ejecución y me preguntaba si esto también es posible en SQL Server (¿al menos en 2008?)?

Supongamos que tengo una tabla muy grande con decenas de millones de filas (bien indexadas, etc.) y necesito buscar algunas filas en particular. Sé que tomará mucho tiempo y me parece bien, pero me gustaría presentarle al usuario algún tipo de barra de progreso.

¿Cómo puedo mostrar el progreso?

¿Fue útil?

Solución

¡Me olvidaría de eso y solo pondría un círculo giratorio!

Sin embargo, en serio, para llevar más lejos la idea de MrTelly, hay vistas de administración dinámicas que pueden proporcionarle tiempos de ejecución promedio para ciertas consultas, tal vez eso pueda llevarlo a alguna parte.

http://msdn.microsoft.com/en-us/library /ms188754.aspx

editar: He visto el porcentaje completado en el procedimiento sp_whoisactive de Adam Machanic. Tal vez ese es otro lugar para mirar. SQL 2016 tiene el almacén de consultas que persiste la información de la caché del plan, un sustituto de la caché del plan dmv, que se borra al reiniciar.

Otros consejos

Relacionados:

  

Los sistemas de base de datos de hoy en día brindan poca información al usuario / DBA sobre   la cantidad de ejecución de una consulta SQL # 8217; s se ha completado. Por mucho   ejecutando consultas, estos comentarios pueden ser muy útiles, por ejemplo, para   ayudar a decidir si la consulta debe terminarse o permitir que se ejecute   hasta su finalización. Aunque el requisito anterior es fácil de expresar,   Desarrollar un indicador robusto de progreso para la ejecución de consultas es   desafiante. En este trabajo, estudiamos el problema anterior y presentamos   Técnicas que pueden formar la base para una estimación efectiva del progreso.   Los resultados de validar experimentalmente nuestras técnicas en Microsoft.   SQL Server son prometedores.

No tengo conocimiento de una herramienta que haga esto automáticamente, pero hay un par de alternativas. Divide tu consulta en bloques ...

select blah from table where IdRange between (1 and 100000)

select blah from table where IdRange between (100001 and 200000)

a medida que se complete cada sql, actualiza la barra de progreso.

O puede registrar la cantidad de tiempo necesario para cada una de sus selecciones, almacenar esos valores tal vez por usuario. Luego use esa información para devolver la longitud de la barra de progreso.

Ambos enfoques son bastante complicados, espero que alguien conozca un mejor enfoque.

Por supuesto, puedes intentar descifrar el plan de consulta y hacer un juicio basado en eso, pero en un código que sería difícil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top