quinta-feira, 16 de setembro de 2010

Fragmentação no Banco de Dados

Bom galera neste post irei falar sobre fragmentação no banco de dados, este é ponto extremamente importante quando se fala em performance de banco de dados. Essas fragmentações ocorrem nos  índices e podem ser de três tipos, fragmentação lógica, fragmentação interna e fragmentação de extent.

Quando criamos um índice com fillfactor igual a 100, quer dizer que todos as páginas utilizadas pelo objeto estão completamente cheia. Conforme mostrado na figura abaixo:


Na figura os retângulos verdes estão representando as páginas do objeto, a seta preta informa a ordem lógica das informações e a seta vermelha a ordem em que as informações estão armazenadas. Esta figura é apenas simbólica para o entendimento sobre fragmentação, pois a estrutura usada no SQL Server é árvore B-Tree.

Existem duas formas que podem fazer o índice ficar fragmentado logicamente, ou seja, a ordem lógica das informações não ficam sequênciais como na figura. Uma maneira é acontecendo Page Split, que é um processo interno do SQL que ocorre quando ele realoca novos dados, quando não há espaços nas páginas para aloca-los ou quando altera o tamanho de um campo varchar por exemplo.
Segue figura exibindo um Page Split.



Pode-se ver que a ordem lógica representado pela seta preta não está mais sequencial, ou seja, está fragmentada.
A utilização normal do banco de dados, fazendo INSERT, UPDATE e DELETE também causa níveis elevados de fragmentação, como demonstrado na figura a seguir:


Pois é pessoal imagina o SQL buscando informações neste índice, a consulta seria extremamente lenta. Isso ocorre caso não seja realizada desfragmentações frequente no banco.

Para verificar o nível de fragmentação no SQL Server 2008 usa-se a DMV sys.dm_db_index_physical_stats, deve-se verificar os campos
avg_fragmentation_in_percent,  fragment_count, avg_fragment_size_in_pages para saber se é necessário desfragmentar ou não o índice .

As formas para realizar a desfragmentação no SQL são ALTER INDEX REBUILD, ALTER INDEX REORGANIZE ou WITH DROP_EXISTING.

Abraços,
Rodrigo Figueiredo

Nenhum comentário:

Postar um comentário