quinta-feira, 12 de fevereiro de 2009

Diferença na ocupação do Transaction Log após término de Transação

Olá... Resolvi escrever outro post sobre Transaction Log devido a grande quantidade de dúvidas que recebo dos alunos, principalmente quanto ao crescimento deste arquivo. Vale a penas recordar os 3 artigos sobre a estrutura do Transaction Log no link http://sqlserver-brasil.blogspot.com/search/label/Transation%20Log.

Uma dúvida freqüente dos meus alunos e clientes é a diferença entre o tamanho alocado no Transaction Log durante uma transação e ao seu final. Vamos visualizar esta diferença utilizando o script abaixo:

Primeiro crie um banco de dados para teste chamado Fluminense com o Recovery Model FULL.

-- Criar pasta c:\TesteLog
USE master
go

CREATE DATABASE Fluminense ON
(NAME = 'Fluminense',
FILENAME = 'C:\TesteLog\Fluminense.mdf',
SIZE = 512MB,FILEGROWTH = 100MB)
LOG ON
(NAME = 'Fluminense_log',
FILENAME = 'C:\TesteLog\Fluminense_log.ldf',
SIZE = 1MB,FILEGROWTH = 1MB)
go

ALTER DATABASE Fluminense SET RECOVERY FULL

Agora vamos verificar a ocupação do Transaction Log utilizando o comando abaixo:

DBCC SQLPERF (LOGSPACE)
-- Resultado:
-- Log Size (MB): 0.9921875
-- Log Space Used (%): 34.69488

Veja que o Transaction Log está com 34% de ocupação, o que corresponde a 0,34 MB. Agora vamos gerar atividade neste banco para observarmos a escrita no Transaction Log, rode o script abaixo:

USE Fluminense
go
CREATE TABLE Teste (c1 INT IDENTITY,

C2 CHAR (8000) DEFAULT (REPLICATE ('F', 8000)));
go

BEGIN TRAN
DECLARE @i int
set @i = 0
WHILE (@i < 50500)
BEGIN
INSERT INTO Teste DEFAULT VALUES
SELECT @i = @i + 1
END

Execute o DBCC SQLPERF (LOGSPACE) para verificar o crescimento:

DBCC SQLPERF (LOGSPACE)
-- Resultado:
-- Log Size (MB): 555,9922
-- Log Space Used (%):99,89989

O Transaction Log passou de 0,34 MB para 555,43 MB. Agora vamos executar um ROLLBACK e verificar a ocupação do Transaction Log novamente:

ROLLBACK TRAN;
GO

DBCC SQLPERF (LOGSPACE)
-- Resultado:
-- Log Size (MB): 555,9922
-- Log Space Used (%):99,89989

O Transaction Log passou a ocupar 473,42 MB, liberando 82,01 MB de espaço interno! Que comportamento estranho... Porque o ROLLBACK liberou espaço?

Bem, a resposta é simples... Enquanto uma transação está em curso o SQL Server já aloca espaço no Transaction Log para realizar a operação de RollBack, sendo liberado este espaço ao final da transação. Se não fosse reservado este espaço no Transaction Log, ao esgotar o espaço em disco durante uma transação, o banco de dados entraria em estado SUSPECT, devido a inviabilidade de realizar o RollBack com conseqüente perda de integridade.

Até o próximo post,
Landry.