No SQL Server 2008 R2, como essas duas reversões são diferentes:
Execute uma
ALTER
instrução por alguns minutos e pressione 'Cancelar execução'. Demora alguns minutos para reverter completamente.Execute a mesma
ALTER
instrução, mas verifique se oLDF
arquivo não é grande o suficiente para ser concluído com êxito. Depois que oLDF
limite é atingido e nenhum 'crescimento automático' é permitido, a execução da consulta para imediatamente (ou ocorre uma reversão) com esta mensagem de erro:
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
Como esses dois são diferentes nos seguintes pontos?
Por que a segunda reversão é instantânea? Não tenho muita certeza se isso poderia ser chamado de reversão. Meu palpite é que o log de transações é gravado à medida que a execução avança e, quando percebe que não há espaço suficiente para concluir completamente a tarefa, ele apenas para com alguma mensagem 'final', sem confirmação.
O que acontece quando a primeira reversão leva tanto tempo (uma reversão é encadeada única)?
2.1 O SQL Server volta e desfaz as entradas feitas noLDF
arquivo?
2.2 OLDF
tamanho do arquivo fica menor no final da reversão (deDBCC SQLPERF(LOGSPACE)
)Uma pergunta adicional: durante o segundo cenário, o SQL Server começa a consumir o
LDF
arquivo rapidamente. No meu caso, aumentou de 18% para 90% nos primeiros minutos (<4 minutos). Mas uma vez que atingiu 99%, permaneceu por mais 8 minutos, variando o uso entre 99,1% e 99,8%. Ele sobe (99,8%) e desce (99,2%) e sobe novamente (99,7%) e desce (99,5%) algumas vezes antes do erro ser lançado. O que está acontecendo nos bastidores?
Quaisquer links do MSDN que possam ajudar a explicar isso mais são bem-vindos.
Por sugestão de Ali Razeghi, estou adicionando perfmon: Disk Bytes/sec
Respostas:
Como indicado acima, depois de executar mais testes, cheguei a conclusões calculadas. Resumi todos eles em um post do blog aqui , mas copiarei algum conteúdo para este post para posteridade.
Conjectura (com base em alguns testes)
A partir de agora, não tenho uma explicação clara sobre o porquê disso. Mas a seguir, minhas estimativas com base nos artefatos coletados durante os testes.
A reversão ocorre nos dois cenários. Uma é a reversão explícita (o usuário pressiona o botão Cancelar), a outra é implícita (o Sql Server toma essa decisão internamente).
Nos dois cenários, o tráfego que vai para o arquivo de log é consistente. Veja as imagens abaixo:
Cenário 1:
Cenário 2:
Um artefato que reforçou essa linha de pensamento é capturar o Sql Trace durante os dois cenários.
Comportamento inexplicável:
Todas as idéias para ajudar a explicar melhor esse comportamento são bem-vindas.
fonte
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:
Cenário 2:
Resultados do Monitor de Desempenho:
Cenário 1:
Cenário 2:
Código:
fonte