[firebase-br] RES: Banco Crescendo Rapidamente
Gladiston Santana
gladiston em vidy.com.br
Ter Fev 5 10:01:24 -03 2013
Todo o lixo a que se refere provavelmente são as versões de registros. As
mesmas são eliminadas através do backup e as páginas em branco são
aproveitadas outra vez sempre que possível. Além disso, ter um campo de
situação que muda de 'S' para 'N' faz criar mais uma versão de registro, e
não faz parar de aumentar de tamanho (ao contrário), talvez sua situação só
resolva nos casos onde o registro não caiba no tamanho de página
(geralmente 4K), talvez você esteja passando por uma situação assim.
Para você entender melhor, recomendo que faça o seguinte experimento :
Pegue a tabela maior que tiver e crie um campo para 'S' ou 'N' - use
char(1) e não use varchar. Então dê um update em todos eles (update tabela
set campo='S').
Depois exporte a tabela para um arquivo .sql, crie então um database novo
de testes e execute o script alí.
Desconecte-se e anote o tamanho da base.
Conecte-se novamente e rode um update nessa tabela envolvendo todos os
registros (update tabela set campo='N').
Desconecte-se e anote o tamanho da base, provavelmente aumentou muito,
claro que não dobra de tamanho, estamos falando de um char(1).
Agora vem o pulo do gato, faça o backup, preferencialmente usando
o utilitário gbak, mas pode ser via API tambem. Só não use alguma opção que
faça manter o garbage - Alguns aplicativos vem com essa opção habilitada.
Conecte-se novamente e rode um update nessa tabela envolvendo todos os
registros, mas dessa vez ponha outro valor (update tabela set campo='S').
Desconecte-se e anote o tamanho da base, quando você fez isso da primeira
vez, o tamanho aumentou, mas dessa vez não aumentou, por que ?
A razão é que o FB aproveita as páginas que houverem em branco sempre
que possível, porque sempre que possível ? Não dá para garantir que seus
updates tenham sempre o mesmo tamanho da página em branco, como as
gravações novas não desejam fragmentar os seus dados em páginas
geograficamente separados, essa nova gravação poderá preferir criar páginas
novas garantido que esses dados sejam contíguos Por isso o
reaproveitamento nem sempre é 1 para 1.
Porque o FB mantém o garbage ? Simples, se houve algo catastrofico em sua
base, ele se corrige sozinho restaurando a ultima versão valida de cada
registro.
Se seu banco aumenta muito você tem de pedir ajuda de alguém experiente
para entender o processo, uma orientação perita irá lhe conferir o que
precisa.
Por exemplo, os varchar são os verdadeiros fragmentadores de database, como
seu tamanho pode variar de um registro para outro, nem sempre
é previsível que um dado novo pode reaproveitar páginas em branco se a
mesma não pode garantir que caberá na página ou se páginas contíguas serão
usadas, além disso, varchars gigantes, por exemplo, para conter um xml de
NFe talvez use varchar(8192), qual o problema disso ? Num database que tem
páginas de 4K (default), fará com que quase sempre páginas novas sejam
criadas e reaproveitar páginas só ocorrerá quando houver grande
espaços contíguos na base, o que pode demorar e se houver muito update essa
base explodirá de tamanho. Neste sentido é melhor usar MEMO´s e char
simples e repudir varchar se sua preocupação for espaço.
Mais detalhes sobre a lista de discussão lista