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:
- Cree una base de datos con un archivo de registro que comience en 1 MB, crezca en fragmentos de 4 MB y tenga un tamaño máximo de 100 MB.
- Abra una transacción explícita, ejecútela durante 10 segundos y luego cancélela manualmente dentro de SSMS
- Mire el recuento de fn_dblog () y el tamaño de reserva de registro y consulte DBCC SQLPERF (LOGSPACE)
Escenario 2:
- Cree una base de datos con un archivo de registro que comience en 1 MB, crezca en fragmentos de 4 MB y tenga un tamaño máximo de 100 MB.
- Abra una transacción explícita, ejecútela hasta que el registro esté lleno. Aparece un error.
- Mire el recuento de fn_dblog () y el tamaño de reserva de registro y consulte DBCC SQLPERF (LOGSPACE)
Resultados del monitor de rendimiento:
Escenario 1:
Escenario 2:
Código:
USE [maestro];
VAMOS
IF DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
EMPEZAR
ALTER DATABASE [SampleDB] SET SINGLE_USER
CON ROLLBACK INMEDIATO;
DROP DATABASE [SampleDB];
FINAL;
VAMOS
CREAR BASE DE DATOS [SampleDB] EN PRIMARIO
(
NOMBRE = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, TAMAÑO = 3MB
, FILEGROWTH = 1MB
)
ACCEDER
(
NOMBRE = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, TAMAÑO = 1MB
, MAXSIZE = 100MB
, FILEGROWTH = 4MB
);
VAMOS
USE [SampleDB];
VAMOS
- Agregar una tabla
CREAR TABLA dbo.test
(
c1 CHAR (8000) NO NULL REPLICATE POR DEFECTO ('a', 8000)
) ENCENDIDO [PRIMARIO];
VAMOS
- Asegúrese de que no somos un modelo de recuperación pseudo-simple
BACKUP DATABASE SampleDB
TO DISK = 'NUL';
VAMOS
- Copia de seguridad del archivo de registro
REGISTRO DE COPIA DE SEGURIDAD SampleDB
TO DISK = 'NUL';
VAMOS
- Verifique el espacio de registro utilizado
DBCC SQLPERF (ESPACIO DE REGISTRO);
VAMOS
- ¿Cuántos registros son visibles con fn_dblog ()?
SELECCIONAR * DESDE fn_dblog (NULL, NULL); - Alrededor de las 9 en mi caso
/ **********************************
ESCENARIO 1
********************************** /
- Abra una nueva transacción y luego retírela
COMIENZA LA TRANSACCIÓN
INSERTAR EN dbo.test VALORES POR DEFECTO;
GO 10000 - Let se ejecuta durante 10 segundos y luego presiona cancelar en la ventana de consulta SSMS
- Cancelar la transacción
- Debería tardar un par de segundos en terminar
- No es necesario revertir la transacción, ya que la cancelación ya lo hizo por usted.
-- Solo inténtalo. Obtendrás este error
- Mensaje 3903, Nivel 16, Estado 1, Línea 1
- La solicitud de TRANSACCIÓN DE ROLLBACK no tiene BEGIN TRANSACTION correspondiente.
TRANSACCIÓN EN ROLLBACK;
- ¿Cuál es el espacio de registro utilizado? Por encima del 100%.
DBCC SQLPERF (ESPACIO DE REGISTRO);
VAMOS
- ¿Cuántos registros son visibles con fn_dblog ()?
SELECCIONE *
DE fn_dblog (NULL, NULL); - Alrededor de 91,926 en mi caso
- ¿Reserva de registro total mostrada por fn_dblog ()?
SELECCIONAR SUMA ([Reserva de registro]) AS [Reserva de registro total]
DE fn_dblog (NULL, NULL); - Alrededor de 88.72MB
/ **********************************
ESCENARIO 2
********************************** /
- Sopla el DB y comienza de nuevo
USE [maestro];
VAMOS
IF DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
EMPEZAR
ALTER DATABASE [SampleDB] SET SINGLE_USER
CON ROLLBACK INMEDIATO;
DROP DATABASE [SampleDB];
FINAL;
VAMOS
CREAR BASE DE DATOS [SampleDB] EN PRIMARIO
(
NOMBRE = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, TAMAÑO = 3MB
, FILEGROWTH = 1MB
)
ACCEDER
(
NOMBRE = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, TAMAÑO = 1MB
, MAXSIZE = 100MB
, FILEGROWTH = 4MB
);
VAMOS
USE [SampleDB];
VAMOS
- Agregar una tabla
CREAR TABLA dbo.test
(
c1 CHAR (8000) NO NULL REPLICATE POR DEFECTO ('a', 8000)
) ENCENDIDO [PRIMARIO];
VAMOS
- Asegúrese de que no somos un modelo de recuperación pseudo-simple
BACKUP DATABASE SampleDB
TO DISK = 'NUL';
VAMOS
- Copia de seguridad del archivo de registro
REGISTRO DE COPIA DE SEGURIDAD SampleDB
TO DISK = 'NUL';
VAMOS
- Ahora, explotemos el archivo de registro dentro de nuestra transacción
COMIENZA LA TRANSACCIÓN
INSERTAR EN dbo.test VALORES POR DEFECTO;
GO 10000
- La reversión nunca se dispara. Intentalo. Obtendrás un error.
- Mensaje 3903, Nivel 16, Estado 1, Línea 1
- La solicitud de TRANSACCIÓN DE ROLLBACK no tiene BEGIN TRANSACTION correspondiente.
TRANSACCIÓN EN ROLLBACK;
- ¿Está el archivo de registro 100% lleno?
DBCC SQLPERF (ESPACIO DE REGISTRO);
- ¿Cuántos registros son visibles con fn_dblog ()?
SELECCIONE *
DE fn_dblog (NULL, NULL); - Alrededor de 91,926 en mi caso
VAMOS
- ¿Reserva de registro total mostrada por fn_dblog ()?
SELECCIONAR SUMA ([Reserva de registro]) AS [Reserva de registro total]
DE fn_dblog (NULL, NULL); - 88.72MB
VAMOS