Eu tenho um aplicativo cujo banco de dados HSQL cresce muito para alguns usuários, mas não para outros. Quando recebi um exemplo em que esse problema aconteceu, descobri que o banco de dados está quase vazio - são quase 16 GB de zeros e apenas algumas dezenas de megabytes de dados reais. Ao executar CHECKPOINT DEFRAG
, ele encolhe para seu tamanho real e pequeno.
Infelizmente, não estou muito familiarizado com esse mecanismo de banco de dados e minhas pesquisas on-line produziram poucas informações úteis. Uma coisa interessante é que existe a opção de realizar a desfragmentação automaticamente ao atingir um determinado tamanho, que não usei. No entanto, eu esperaria que o banco de dados reutilizasse as linhas mortas e não as mantivesse por perto, e definitivamente não zeradas, pois isso deve ter um efeito ruim no desempenho.
Por que o banco de dados continua produzindo tanto espaço vazio, que só é interrompido por dados aqui e ali? Como posso descobrir o que está acontecendo?
Uma explicação é o caso em que muitas linhas de dados são criadas, mas posteriormente excluídas pelo aplicativo. Se essas linhas estiverem no cache de memória o tempo todo, elas nunca serão gravadas no disco.
O espaço para linhas excluídas é reutilizado para até 500 itens mais recentes, o restante é descartado.
O comando CHECKPOINT DEFRAG pode ser usado de tempos em tempos para compactar um banco de dados que possui muitos espaços vazios.
O mecanismo de banco de dados não grava zeros. Os zeros no arquivo estão lá quando algum espaço de arquivo é alocado para uso.