domingo, 21 de outubro de 2007

Script para Reindexar Tabelas e Liberar Espaço

Utilizo o script abaixo para verificar o status de todas as tabelas de um database, reindexar os índices das mesmas, e atualizar o espaço utilizado pelos índices.

Na primeira parte, identifico o nome do database e salvo em uma variável, para uso mais adiante.

O conceito do script baseia-se num cursor, criado a partir da lista de tabelas, armazenadas na tabela do sistema SysObjects (se preferir, utilize as tabelas do Information_Schema).

O comando para verificar a tabela, é o "dbcc checktable".
Detalhe importante: o database precisa estar em modo SINGLE_USER para este comando ser executado com sucesso.

O comando para reindexar a tabela é o "dbcc dbreindex".

O comando para atualizar o espaço utilizado é o "dbcc updateusage".

Consulte o BOL para sintaxe dos parâmetros.

Para usá-lo, abra o Query Analyzer, e posicione no database desejado.
Ou acrescente na primeira linha, o comando USE, para selecionar o database, caso necessite executar a partir do utilitário O-SQL.

-- Inicio
DECLARE @DsDatabase SYSNAME
SELECT @DsDatabase = D.Name
FROM Master..SysProcesses P, Master..SysDatabases D
WHERE P.Dbid = D.Dbid
AND P.Spid = @@Spid

DECLARE @NomeTabela VARCHAR(80)
DECLARE CursorTabelas CURSOR FAST_FORWARD
FOR
SELECT DISTINCT CONVERT(VARCHAR(80), T.Name) AS Objeto
FROM SysObjects T, SysIndexes I
WHERE T.Type = 'U'
AND I.Id = T.Id
ORDER BY Objeto
OPEN CursorTabelas
FETCH NEXT FROM CursorTabelas INTO @NomeTabela
WHILE @@fetch_status = 0
BEGIN
PRINT 'Reindexando tabela ' + @NomeTabela + '...'
IF (SELECT DATABASEPROPERTYEX (@DsDatabase, 'UserAccess')) = 'SINGLE_USER'
DBCC CHECKTABLE (@NomeTabela, REPAIR_ALLOW_DATA_LOSS)
DBCC DBREINDEX (@NomeTabela)
DBCC UPDATEUSAGE (@DsDatabase, @NomeTabela)
FETCH NEXT FROM CursorTabelas INTO @NomeTabela
END
CLOSE CursorTabelas
DEALLOCATE CursorTabelas
-- Fim

2 comentários:

Anônimo disse...

muito bom. Consegui resolver meu problema num banco que estava corrompido.

Alexandre Teles unnisoft@hotmail.com disse...

LEGAL!!! CONSEGUI RESOLVER MEU PROBLEMA COM UM BANCO CORROMPIDO!