terça-feira, 21 de setembro de 2010

IP3 Tecnologia vaga para Desenvolvimento

Desenvolvedor

Área: Desenvolvimento

Perfil

- Experiência em Plataforma Microsoft (ASP 3.0 e ASP.NET)
- Facilidade com Javascript, CSS
- Conhecimento em OO
- Experiência com programação em Banco de dados Relacional (Desejável SQL Server)

Título do e-mail: Desenvolvedor
Enviar e-mail para: rh@ip3.info

Abraços,
Rodrigo Figueiredo

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

sexta-feira, 10 de setembro de 2010

Entendendo o armazenamento de dados

Quando fazemos um INSERT no banco de dados estamos inserindo informações, mas muitos desenvolvedores e até DBAs não sabem como essas informações ficam armazenadas dentro do SQL Server, como é controlada a alocação das páginas e extents ou qual a estrutura usada para o armazenamento.

Irei falar um pouco sobre armazenamento de dados no SQL Server e como funcionam a utilização de páginas, extents, PFS, GAM e SGAM.

Todas as informações do SQL Server ficam armazenadas em páginas. Páginas são blocos de dados de 8K, se a informação for maior do que 8K ela irá ocupar quantas páginas forem necessárias.
Outra estrutura existente no SQL é chamada de extent, uma extent é formada por um conjunto de 8 páginas, totalizando então 64K. Uma extent pode ser uniforme, caso tenha informações de somente um objeto ou mista caso tenha informações de mais de um objeto. Todo novo objeto criado no banco de dados utiliza uma página em uma extent mista, quando este objeto atingir 64K ele passa a ocupar uma extent inteira, ou seja, uma extent uniforme.
Para alocar as informações o SQL Server utiliza GAM (Global Allocation Map) e SGAM (Shared Global Allocation Map) para o controle de extents e PFS(Page Free Space) para controlar as páginas. As informações de GAM e SGAM controlam até 63904 extent (4GB), então a cada 4GB de informações existem informações de GAM e SGAM. São com essas informações que o SQL controla se uma extent é uniforme ou mista ou se uma extent possui página disponível para alocação por exemplo. Quando uma extent é mista ela utiliza as informações da SGAM para fazer este controle, quando o bit da SGAM estiver como 0 é porque a extent está cheia e não há espaço para alocação, quando o bit for 1 é porque a extent é mista e existe pelo menos uma página disponível. Quando uma extent é uniforme ela passa a utilizar a GAM, quando o bit da GAM for 1 é porque está livre e quando for 0 está alocada.
Para fazer o controle de páginas é utilizada a informação da PFS, essa informação aparece a cada 8088 páginas (64MB). É através da PFS que o SQL controla a quantidade disponível para alocação na página, ela guarda informação em percentual e por faixa, seguem as faixa por fator de preenchimento que o SQL utiliza:
Faixa 1: 0% a 50%
Faixa 2: 51% a 80%
Faixa 3: 81% a 95%
Faixa 4: 96% a 100%

Existe ainda outra informação chamada de IAM (Index Allocation Map), possui praticamente a mesma estrutura da GAM e SGAM. Uma IAM é usada para guarda informações de somente um objeto, ou seja, toda tabela ou índice possui uma IAM, através dela é possivel ver todas as extents que pertence a um objeto.

Está é uma visão geral de como o SQL Server gerencia o controle e armazenamento das informações.

Abraços,
Rodrigo Figueiredo