Eu tentei o seguinte experimento e obtive resultados semelhantes. Nos dois casos, o fn_dblog () mostra a reversão e parece ocorrer mais rapidamente no Cenário 2 do que no Cenário 1.
A propósito, coloquei o MDF e o LDF no mesmo disco externo (USB 2.0).
Minha conclusão inicial é que não há diferença na operação de reversão neste caso, e provavelmente qualquer diferença aparente de velocidade está relacionada ao subsistema de E / S. Essa é apenas a minha hipótese de trabalho no momento.
Cenário 1:
- Crie um banco de dados com um arquivo de log que comece em 1 MB, cresça em pedaços de 4 MB e tenha um tamanho máximo de 100 MB.
- Abra uma transação explícita, execute-a por 10 segundos e cancele-a manualmente no SSMS
- Veja o tamanho da reserva fn_dblog () count e log e confira DBCC SQLPERF (LOGSPACE)
Cenário 2:
- Crie um banco de dados com um arquivo de log que comece em 1 MB, cresça em pedaços de 4 MB e tenha um tamanho máximo de 100 MB.
- Abra uma transação explícita, execute-a até o erro completo do log aparecer
- Veja o tamanho da reserva fn_dblog () count e log e confira DBCC SQLPERF (LOGSPACE)
Resultados do Monitor de Desempenho:
Cenário 1:
Cenário 2:
Código:
USE [mestre];
IR
SE DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
INÍCIO
ALTER DATABASE [SampleDB] SET SINGLE_USER
COM ROLLBACK IMEDIATO;
DROP DATABASE [SampleDB];
FIM;
IR
CRIAR BASE DE DADOS [SampleDB] NO PRIMÁRIO
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, SIZE = 3MB
, FILEGROWTH = 1MB
)
ENTRAR
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, SIZE = 1MB
, MAXSIZE = 100 MB
, FILEGROWTH = 4MB
);
IR
USE [SampleDB];
IR
- Adicione uma tabela
CRIAR TABELA dbo.test
(
c1 CHAR (8000) NÃO NULL REPLICATE PADRÃO ('a', 8000)
) ON [PRIMÁRIO];
IR
- Garantir que não somos é um modelo de recuperação pseudo-simples
BACKUP DATABASE SampleDB
PARA DISCO = 'NUL';
IR
- Faça backup do arquivo de log
LOG DE BACKUP SampleDB
PARA DISCO = 'NUL';
IR
- Verifique o espaço de log usado
DBCC SQLPERF (LOGSPACE);
IR
- Quantos registros são visíveis com fn_dblog ()?
SELECT * FROM fn_dblog (NULL, NULL); - Cerca de 9 no meu caso
/ **********************************
CENÁRIO 1
********************************** /
- Abra uma nova transação e reverta-a
COMEÇAR A TRANSAÇÃO
INSERIR EM dbo.test VALORES PADRÃO;
GO 10000 - Let é executado por 10 segundos e pressione Cancel na janela de consulta do SSMS
- Cancelar a transação
- Demora alguns segundos para terminar
- Não há necessidade de reverter a transação, pois o cancelamento já fez isso por você.
-- Apenas tente. Você receberá este erro
- Msg 3903, Nível 16, Estado 1, Linha 1
- A solicitação ROLLBACK TRANSACTION não tem BEGIN TRANSACTION correspondente.
TRANSAÇÃO ROLLBACK;
- Qual é o espaço de log usado? Acima de 100%.
DBCC SQLPERF (LOGSPACE);
IR
- Quantos registros são visíveis com fn_dblog ()?
SELECT *
FROM fn_dblog (NULL, NULL); - Cerca de 91.926 no meu caso
- Reserva total de log mostrada por fn_dblog ()?
SELECIONAR SOMA ([Reserva de Log]) AS [Reserva Total de Log]
FROM fn_dblog (NULL, NULL); - Cerca de 88,72MB
/ **********************************
CENÁRIO 2
********************************** /
- Afaste o banco de dados e comece de novo
USE [mestre];
IR
SE DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
INÍCIO
ALTER DATABASE [SampleDB] SET SINGLE_USER
COM ROLLBACK IMEDIATO;
DROP DATABASE [SampleDB];
FIM;
IR
CRIAR BASE DE DADOS [SampleDB] NO PRIMÁRIO
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, SIZE = 3MB
, FILEGROWTH = 1MB
)
ENTRAR
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, SIZE = 1MB
, MAXSIZE = 100 MB
, FILEGROWTH = 4MB
);
IR
USE [SampleDB];
IR
- Adicione uma tabela
CRIAR TABELA dbo.test
(
c1 CHAR (8000) NÃO NULL REPLICATE PADRÃO ('a', 8000)
) ON [PRIMÁRIO];
IR
- Garantir que não somos é um modelo de recuperação pseudo-simples
BACKUP DATABASE SampleDB
PARA DISCO = 'NUL';
IR
- Faça backup do arquivo de log
LOG DE BACKUP SampleDB
PARA DISCO = 'NUL';
IR
- Agora, vamos explodir o arquivo de log dentro de nossa transação
COMEÇAR A TRANSAÇÃO
INSERIR EM dbo.test VALORES PADRÃO;
GO 10000
- A reversão nunca é acionada. Tente. Você receberá um erro.
- Msg 3903, Nível 16, Estado 1, Linha 1
- A solicitação ROLLBACK TRANSACTION não tem BEGIN TRANSACTION correspondente.
TRANSAÇÃO ROLLBACK;
- O arquivo de log está 100% cheio?
DBCC SQLPERF (LOGSPACE);
- Quantos registros são visíveis com fn_dblog ()?
SELECT *
FROM fn_dblog (NULL, NULL); - Cerca de 91.926 no meu caso
IR
- Reserva total de log mostrada por fn_dblog ()?
SELECIONAR SOMA ([Reserva de Log]) AS [Reserva Total de Log]
FROM fn_dblog (NULL, NULL); - 88,72MB
IR