En SQL Server 2008 R2, ¿en qué se diferencian estos dos retrocesos?
Ejecute una
ALTER
declaración, durante unos minutos, y luego presione 'Cancelar ejecución'. Tarda unos minutos en retroceder por completo.Ejecute la misma
ALTER
instrucción, pero asegúrese de que elLDF
archivo no sea lo suficientemente grande para que se complete correctamente. Una vez queLDF
se alcanza el límite y no se permite el 'crecimiento automático', la ejecución de la consulta se detiene inmediatamente (o se produce una reversión) con este mensaje de error:
The statement has been terminated.
Msg 9002, Level 17, State 4, Line 1
The transaction log for database 'SampleDB' is full.
To find out why space in the log cannot be reused, see the
log_reuse_wait_desc column in sys.databases
¿Cómo son estos dos diferentes en los siguientes puntos?
¿Por qué es instantáneo el segundo 'retroceso'? No estoy completamente seguro de si podría llamarse una reversión. Supongo que el registro de transacciones se escribe a medida que avanza la ejecución y una vez que se da cuenta de que no hay suficiente espacio para completar la tarea por completo, simplemente se detiene con algún mensaje de "finalización", sin confirmación.
¿Qué sucede cuando la primera reversión toma tanto tiempo (es una reversión de un solo subproceso)?
2.1. ¿SQL Server retrocede y deshace las entradas realizadas en elLDF
archivo?
2.2. ElLDF
tamaño del archivo se reduce al final de la reversión (desdeDBCC SQLPERF(LOGSPACE)
)Una pregunta adicional: durante el segundo escenario, SQL Server comienza a consumir
LDF
archivos con bastante rapidez. En mi caso, aumentó del 18% al 90% en los primeros minutos (<4 minutos). Pero una vez que alcanzó el 99%, permaneció allí durante otros 8 minutos, mientras que el uso fluctuaba entre 99.1% y 99.8%. Sube (99.8%) y baja (99.2%) y sube nuevamente (99.7%) y baja (99.5%) algunas veces antes de que se produzca el error. ¿Qué está pasando detrás de escena?
Se agradece cualquier enlace de MSDN que pueda ayudar a explicar esto más.
A sugerencia de Ali Razeghi, estoy agregando perfmon: Disk Bytes/sec
Respuestas:
Como se indicó anteriormente, después de ejecutar más pruebas, llegué a conclusiones calculadas. Los resumí a todos en una publicación de blog aquí , pero copiaré algún contenido a esta publicación para la posteridad.
Conjetura (basada en algunas pruebas)
A partir de ahora, no tengo una explicación clara de por qué esto es así. Pero a continuación están mis estimaciones basadas en los artefactos reunidos durante las pruebas.
La reversión ocurre en ambos escenarios. Uno es la reversión explícita (el usuario presiona el botón Cancelar), el otro es implícito (el servidor SQL toma esa decisión internamente).
En ambos escenarios, el tráfico que va al archivo de registro es consistente. Vea las imágenes a continuación:
Escenario 1:
Escenario 2:
Un artefacto que reforzó esta línea de pensamiento es capturar Sql Trace durante ambos escenarios.
Comportamiento inexplicable:
Cualquier idea para ayudar a explicar este comportamiento de una mejor manera es bienvenida.
fuente
Intenté el siguiente experimento y obtuve resultados similares. En ambos casos, fn_dblog () muestra una reversión que ocurre y parece suceder más rápido en el Escenario 2 que en el Escenario 1.
Por cierto, coloqué el MDF y el LDF en el mismo disco externo (USB 2.0).
Mi conclusión inicial es que no hay diferencia en la operación de reversión en este caso, y probablemente cualquier diferencia aparente de velocidad esté relacionada con el subsistema de E / S. Esa es solo mi hipótesis de trabajo en este momento.
Escenario 1:
Escenario 2:
Resultados del monitor de rendimiento:
Escenario 1:
Escenario 2:
Código:
fuente