[firebase-br] FW: Tamanho do DB

Marcelo Richter marcelo em brs.ind.br
Qua Maio 26 13:14:28 -03 2010


Senhores,

 

Peço ajuda pois sou relativamente novo no Firebird e estou encontrando um
problema no armazenamento de uma grande quantidade de dados. 

Estou desenvolvendo um aplicativo em C++Builder/Firebird 2.1 para geração de
dados históricos em sistemas de controle prediais. Verifiquei que a base de
dados estava se tornando muito grande para a pouca quantidade de dados
gerados.

 

Vou tentar explicar a situação:

 

Tenho 3 tabelas: TABELA_A, TABELA_B, TABELA_C. Cada uma destas tabelas
possui os seguintes campos: DATA (timestamp), VALOR (float) e mais 2 INTs
com identificações internas do sistema. 

A diferença entre estas tabelas está na resolução de cada uma. A TABELA_A
recebe os dados brutos lidos da planta. A TABELA_B contém os dados com
resolução de 1 dia. Esta tabela é a soma ou média dos dados da TABELA_A,
para cada dia.

A TABELA_C são os dados agrupados por mês. 

O sistema insere os dados coletados na TABELA_A, sendo que a TABELA_B e
TABELA_C são geradas por um trigger+procedure a cada inserção na TABELA_A.

 

As tabelas possuem como chave primária os campos DATA + um dos ID internos
que identifica a variável sendo monitorada, evitando que dois registros com
a mesma data sejam inseridos para a mesma variável. Já deixei a tabela sem
chave primária e criei um índice único com estes dois campos, mas o efeito
foi o mesmo.

 

O problema apareceu quando inseri dados de 1 canal monitorado a cada 5
minutos no período de 1 ano. O DB aumentou aproximadamente 20M de tamanho.
Como esperava algo próximo de 2M, calculando pelo tamanho dos campos,
verifiquei pelas estatísticas do DB, geradas pelo IBOConsole o tamanho de
cada tabela. A TABELA_A possui alocado 1734 páginas (x 4096 bytes/pagina)
para 113869 records, o que resulta em ~62 bytes/record. Bem maior que o
tamanho dos campos,  mas aceitável.

 

Verificando a TABELA_B, obtive 1653 bytes/record. Uma diferença
impressionante para uma tabela com a mesma estrutura que a anterior. Na
TABELA_C, 1479 bytes/record.

 Não sei se minha análise está correta, mas não encontrei outras informações
sobre o tamanho das tabelas e índices.

 

Nas procedures que geram os dados para as TABELAS_B e C, anteriormente usava
o comando DELETE , calculava o novo valor e um INSERT. O tamanho era
aproximadamente 10M maior que o atual. Imagino que isto ocorra pois os
records apagados não são removidos da base e ainda não podem ser
reutilizados pois a transação se mantém ativa até o final da inserção.
Alterei as procedures para utilizar o UPDATE OR INSERT e consegui esta
redução para os tamanho citados. Não há outros comandos nas procedures que
afetem a base de dados, somente SELECTs e cálculos com variáveis locais.

 

Onde poderia buscar mais informações para resolver este problema? 

 

Abraço,

 

Marcelo Richter

marcelo em brs.ind.br

 

 

 




Mais detalhes sobre a lista de discussão lista