Banco de Dados - SQL Server

Como Funciona o Fill Factor do SQL Server

A opção FILL FACTOR determina quantos % de uma página de dados deve ser preenchido com o índice e quanto deve ser mantido em branco, reservado para inclusões e alterações.

por Equipe Linha de Código



Imagine que você tenha uma prateleira com 1000 livros que estejam organizados em ordem alfabética. Se você grudar um livro no outro, quando você tiver outro livro para colocar lá, terá que empurrar todos os livros na prateleira, até achar um espaço para encaixar o livro na ordem alfabetica, fazendo um enorme esforço. Porém, se você reservar um espaço de 1 livro a cada 10 livros que você coloque, você não precisará fazer tanto esforço, já que existe espaço disponível.

Quando você cria índices nas suas tabelas, o SQL Server organiza estes dados dentro de páginas de índice. Assim que você adiciona ou modifica alguma linha, o SQL Server precisa reorganizar esta página de índice, e isso leva algum tempo. A opção FILL FACTOR determina quantos % de uma página de dados deve ser preenchido com o índice e quanto deve ser mantido em branco, reservado para inclusões e alterações.

Por exemplo, se marcarmos FILL FACTOR = 80%, então o SQL Server irá apenas preencher 80% de cada página com os índices. Se você alterar ou incluir dados, o SQL Server consegue reorganizar os índices de maneira mais rápida, pois ele tem 20% de espaço em branco em cada página de dados para poder preencher.

A decisão de usar ou não FILL FACTOR depende do número de inclusões e alterações que você espera receber em sua tabela. Se seu banco for utilizado somente para CONSULTA, então a melhor coisa a se fazer é colocar FILL FACTOR 100%, pois não há a necessidade de deixar espaço em branco nas páginas de índice, já que eles jamais serão organizados.

Já se você tem muitas atualizações, você terá que fazer um cálculo para ter um número ponderado. Você precisa dos seguintes dados:

  • Quantos registros sua tabela já tem.
  • Quantos registros por dia serão adicionados ou alterados
  • Quanto tempo você tem para fazer manutenções nesta base de dados.

Imaginemos que sua tabela tem 1.000.000 de registros e que, diariamente, 10.000 novos registros são adicionados/modificados. Se colocarmos fill factor = 90%, muito provavelmente em 10 dias o espaço em branco que o SQL Server reservou já foi todo tomado. Você sentirá uma queda de performance na hora de incluir registros em sua tabela. Agora, se você colocar fill factor = 70%, você não terá queda de de performance durante 1 mês.

Se você tem espaço disponível no seu banco, pode aumentar este número para adiar ao máximo quando você terá que fazer uma manutenção no índice do seu banco de dados.

PORÉM, (como sempre tem que ter algo para nos aborrecer), o SQL Server não redimenciona as páginas em branco, você terá que excluir e criar o índice novamente para liberar novo espaço. É uma carma, eu sei, mas não faria sentido o SQL Server redimencionar o espaço em branco, pois esta operação é a mesma que reorganizar os índices. Portanto, esta deve ser uma operação manual e cabe ao DBA se organizar ou criar JOBs que façam isso em momento que o banco de dados não é utilizado. (Trabalho duro, mas se fosse fácil ninguem teria emprego)

Existe uma desvantagem de usar um FILL FACTOR muito baixo. Como com o FILL FACTOR BAIXO deixa muita informação em branco nas páginas de dados, o SQL Server tem que percorrer muito espaço para localizar as informações lá contidas, tornando sua CONSULTA um pouco mais lenta. (não é nem um absurdo, mas é uma realidade).

Muitas vezes temos que adicionar muitas informações de uma única vez em uma tabela que já tem seus índices criados.

O ideal, neste caso, é diminuir o FILL FACTOR para criar espaço livre nos índices, incluir os dados, e retornar ao normal novamente. Pode parecer besteira, mas dependendo do volume da informação, isso faz tamanha diferença. Uma coisa é adicionar 100 registros em uma "queryzinha", outra coisa é inserir 1 milhão de registros em uma tabela que está armazenada em outro Servidor SQL Server

CONCLUSÃO

A única forma de se saber qual o FILL FACTOR ideal é na TENTATIVA e ERRO. (formulá mágica não existe)

Pegue uma tabela com muitos registros, faça diversas alterações nos índices e teste o tempo das respostas das consultas, inclusões e alterações. Você verá que detalhes que antes passavam despercebidos agora terão mais sentido para você.

Equipe Linha de Código

Equipe Linha de Código