Reorganizando Indexes – SQL Server

Neste artigo irei mostrar um script que reorganiza todos os Indexes dos databases de usuário (nenhum de sistema).

Links Úteis
O que são Indexes?
Como criar um Index
Boas práticas para criação de Indexes (em inglês)

Script

DECLARE
	 @Database		varchar(255)
	,@Table			varchar(255)
	,@Cmd			nvarchar(500)
	,@ReadOnly		bit
	,@TimeStart		datetime
	,@TimeEnd		datetime

DECLARE DatabaseCursor CURSOR FOR
	SELECT
		Name, Is_Read_Only
	FROM
		master.sys.databases 
	WHERE
		database_id > 4 -- Ele apenas irá selecionar os databases dos usuários (não mostra os do sistema)
	ORDER BY
		Name

OPEN DatabaseCursor
FETCH NEXT FROM DatabaseCursor INTO @Database, @ReadOnly

While @@FETCH_STATUS = 0
Begin
	If @ReadOnly = 1
	Begin
		Set @Cmd = 'ALTER DATABASE ' + @Database + ' SET READ_WRITE WITH NO_WAIT;'
		Exec(@Cmd)
	End
	
	Set @Cmd = 
			'DECLARE TableCursor CURSOR FOR 
					SELECT 
						''['' + table_catalog + ''].['' + table_schema + ''].['' + table_name + '']'' as tableName 
					FROM 
						[' + @Database + '].INFORMATION_SCHEMA.TABLES 
					WHERE 
						Table_Type = ''BASE TABLE'''
	
	Set @TimeStart = GetDate()
	
	PRINT 'Início do processo para reorganizar todos os indexes: '
		+ @Database + ': ' + Convert(varchar(25), @TimeStart, 121)
		
	Exec(@Cmd)
	
	OPEN TableCursor
	FETCH NEXT FROM TableCursor INTO @Table
	
	While @@FETCH_STATUS = 0
	Begin
		Set @Cmd = 'ALTER INDEX ALL ON ' + @Table + ' REORGANIZE'
		Exec(@Cmd)
		FETCH NEXT FROM TableCursor INTO @Table
	End
	
	CLOSE TableCursor
	DEALLOCATE TableCursor
	
	Set @TimeEnd = GetDate()
	
	PRINT 'Encerramento do processo para reorganizar todos os indexes: '
		+ @Database + ': ' + Convert(varchar(25), @TimeStart, 121)
		
	PRINT 'Processo de execução: '
		+ Convert(varchar(100), DateDiff(ss, @TimeStart, @TimeEnd)) + ' segundos.'
	PRINT ''
		
	If @ReadOnly = 1
	Begin
		Set @Cmd = 'ALTER DATABASE ' + @Database + ' SET READ_ONLY WITH NO_WAIT'
		Exec(@Cmd)
	End
	
	FETCH NEXT FROM DatabaseCursor INTO @Database, @ReadOnly
End

CLOSE DatabaseCursor
DEALLOCATE DatabaseCursor

1 thoughts on “Reorganizando Indexes – SQL Server

Deixe um comentário