terça-feira, 2 de agosto de 2016

Indexação MS SQL Server

Fashion
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
BEGIN
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'

Nenhum comentário:

Postar um comentário