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”