Fashion

Indexação MS SQL Server

Olá Pessoal,


Hoje tive a necessidade de criar um procedimento para reindexar todos os índices de todas as tabelas de um determinado banco de dados, de forma automática, ou seja, quando uma tabela for criada, o procedimento inclui automaticamente a nova estrutura para reindexação, caso existam índices.


Criei um JOB para garantir o processamento diário.


Segue a procedure:

CREATE PROCEDURE SP_REINDEXARTABELAS ( @Database_input VARCHAR(255) )
AS
BEGIN
DECLARE @Database VARCHAR(255)
DECLARE @Table VARCHAR(255)
DECLARE @cmd NVARCHAR(500)
DECLARE @fillfactor INT


SET @fillfactor = 90


DECLARE DatabaseCursor CURSOR FOR
SELECT name FROM master.dbo.sysdatabases WHERE name NOT IN ('master','msdb','tempdb','model','distribution') and name = @database_input ORDER BY 1
OPEN DatabaseCursor


FETCH NEXT FROM DatabaseCursor INTO @Database


WHILE @@FETCH_STATUS = 0
BEGIN
SET @cmd = 'DECLARE TableCursor CURSOR FOR SELECT '''' + table_name + '''' as tableName FROM [' + @Database + '].INFORMATION_SCHEMA.TABLES WHERE table_type = ''BASE TABLE'''
EXEC (@cmd)
OPEN TableCursor


FETCH NEXT FROM TableCursor INTO @Table
WHILE @@FETCH_STATUS = 0
BEGIN
IF (@@MICROSOFTVERSION / POWER(2, 24) >= 9)
BEGIN
SET @cmd = 'use '+@database_input +';
ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ');'
EXEC (@cmd)
END
ELSE
EGIN
SET @cmd = 'use '+@database_input +';
DBCC DBREINDEX('+@Table+','' '','+ convert(char(2),@fillfactor)+'); '
EXEC (@cmd)
END
FETCH NEXT FROM TableCursor INTO @Table
END
CLOSE TableCursor
DEALLOCATE TableCursor
FETCH NEXT FROM DatabaseCursor INTO @Database
END
CLOSE DatabaseCursor
DEALLOCATE DatabaseCursor
END


Para executar o procedimento:


EXEC SP_REINDEXARTABELAS 'nome_banco'

Anderson Abreu

ad banner