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