Para o site

Rebuild e Reorganize

Fala Malta!

Vocês já ouviram fala em fragmentação dos índices ?

Em um ambiente de banco de dados a otimização e desempenho são cruciais para garantir que as consultas sejam executadas de forma eficiente. Uma parte fundamental desse processo, que vem após a criação correta de índices, é a manutenção dos índices, e isso inclui as operações de rebuild e reorganize.

Alias se você tem duvidas sobre índices ainda recomendo assistir este vídeo onde o Italo fala sobre o índice Cluster, tenho certeza que com ele você saberá como funciona um índice e como cria-lo da forma correta.

Certo, mas o que é a fragmentação do índice e como ela ocorre ?

A fragmentação mais aprofundada vou deixar pra explicar em outro post, mas como mencionado no vídeo, os índices são organizados de maneira ordenada, mas em uma tabela que sempre está sofrendo INSERT, UPDATE e DELETE, essa organização passa a ficar um pouco caótica gerando uma certa desorganização as paginas de dados dos índices.

Rebuild e Reorganize, o que são, como surgem e como solucionar:

Antes de detalhamos as rotinas de rebuild e reorganize, é importante entender a diferença entre os dois:

Rebuild (Reconstruir): Esta função literalmente reconstrói o índice existente, e o reconstrói do zero mesmo. Isso resulta em um índice totalmente otimizado e compactado. No entanto, durante o processo de reconstrução, o índice fica indisponível, o que pode afetar o desempenho das consultas que dependem dele.
Então, pelo amor que você tem a sua profissão, JAMAIS, eu disse JAMAIS rode um rebuild em horário de produção do banco.

Reorganize (Reorganizar): Esta operação reorganiza os dados dentro do índice existente, eliminando espaços em branco e reestruturando as páginas do índice. Ao contrário do rebuild, a reorganização é uma operação online, o que significa que o índice permanece acessível durante todo o processo.

Quando devo utilizar Rebuild e Reorganize?

A escolha entre rebuild e reorganize depende do estado atual de fragmetação do índice e das necessidades específicas do ambiente de banco de dados.

Rebuild: Recomenda-se usar rebuild quando o índice está fragmentado em excesso, ou seja, quando o fator de fragmentação está significativamente alto. Um índice altamente fragmentado pode prejudicar o desempenho das consultas, e um rebuild pode resolver esse problema.

Reorganize: Por outro lado, a reorganização é uma opção mais leve e é adequada para índices com fragmentação moderada. Se o índice não estiver excessivamente fragmentado, a reorganização pode ser suficiente para melhorar o desempenho, evitando o tempo de inatividade associado ao rebuild.

Rebuild de Índice:

ALTER INDEX ALL ON NomeDaTabela REBUILD;


Reorganize de Índice:

ALTER INDEX ALL ON NomeDaTabela REORGANIZE;

Lembre-se de substituir “NomeDaTabela” pelo nome da tabela onde o índice está localizado. Você também pode especificar um índice específico em vez de “ALL” se desejar reconstruir ou reorganizar apenas um índice específico.

Na empresa atual em que trabalho tenho rotina que correm de madrugada para fazer estas manutenções, segue um trecho do codigo que utilizo

				
					SELECT 
       sch.name AS SchemaName 
     , OBJECT_NAME(ind.OBJECT_ID) AS TableName
     , ind.name AS IndexName
     , indexstats.index_type_desc AS IndexType
     , indexstats.avg_fragmentation_in_percent
     , 'ALTER INDEX ' + QUOTENAME(ind.name)  + ' ON ' + QUOTENAME( sch.name ) + '.' + QUOTENAME(object_name(ind.object_id)) + 
       CASE WHEN indexstats.avg_fragmentation_in_percent>30 THEN ' REBUILD ' 
            WHEN indexstats.avg_fragmentation_in_percent>=5 THEN ' REORGANIZE '
            ELSE NULL 
	   END as [SQLQuery]  -- if <5 not required, so no query needed
 FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, NULL) indexstats 
 INNER 
 JOIN sys.indexes ind ON ind.object_id = indexstats.object_id 
                     AND ind.index_id = indexstats.index_id 
 JOIN sys.objects obj on ind.object_id = obj.object_id
 JOIN sys.schemas sch on obj.schema_id = sch.schema_id
WHERE 1 = 1
  --indexstats.avg_fragmentation_in_percent , e.g. >10, you can specify any number in percent 
  and ind.Name is not null 
ORDER BY indexstats.avg_fragmentation_in_percent DESC

				
			

Add a Comment

Your email address will not be published. Required fields are marked *