HSQL 650.000 insert's de cara!

Boa tarde a todos do forum…
estou teimando em usar o HSQL como banco do meu framework para
desenvolvimento rapido de aplicações desktop :slight_smile:
Como os dados fazem parte do framework
estou inserindo na primeira vez que se abre a aplicação
TODOS os CEPS do Brasil (650.000 registros).
até os 6000 primeiros tudo ocorre numa boa,
mais depois a performance vai caindo em ritmo de P.G
o consumo de memória esta Ok e já tentei até
retirar todas as contraints e criar indices,
mais de nada adianta…
já tentei tb ficar compactando e reconectando durante o processo,
para eliminar o arquivo de LOG, mais tb não adiantou.
alguem sabe alguma manha esperta para fazer com que o HSQLDB
aceite tantos registros assim de maneira rapida?
o export da base aonde coletei os dados (Oracle 10g) demorou apenas 1 minuto

Vlw ai quem tiver alguma dica :wink:

como vc ta fezendo essa inserção vc da inicia e termina uma transação com o banco apos cada inserção ou após todas inserções??

Estou utilizando PreparedStatements.
apenas fecho a conexão no final de tudo.
dou commit de 300 em 300 linhas

como que ta configurado o oracle ele ta em configurado com auto commit??

Não estou usando o Oracle :smiley:
estou usando o HSQL,
dei o exemplo do export do dados do Oracle apenas para comparações

cara, por que tu usa o HSQL?

eu sinceramente prefiro o Derby, já tentou usar ele?

Já exprimentou o H2DataBase???

Veja bem o grafico de performance… acho q não é preciso dizer mais nada :stuck_out_tongue:

Há e uma dica… use o addBatch e o executeBatch do PreparedStatement nestes casos…

1º É natural a performance cair… afinal o arquivo onde as informações estão sendo inseridas esta ficando maior cada vez maior.

2º Procure pela documentação do banco que esta usando, motivo:

Vc tem que estar atento aos “rollbacks” alguns bancos armazenam as operações em memória para que ele possa voltar ao estado anterior caso ele msm falhe (isso é um procedimento interno do banco). Geralmete isto é configurado no Banco naum no aplicativo.

Outro ponto tire todos os indices de sua tabela… inserção com indices ativos é mais custosa

3º 300 linhas?!?!?!?! qdo tive que inserir uma qtde de dados grande assim (3,5 milhoes de registros) utilizava lotes de 5 mil a 25 mil dependendo, ler do disco e escrever no disco tem um custo alto, ler da memoria e escrever no disco o custo é um pouco menor.

Espero ter ajudado

1º) Seria natural cair tanto se eu gravasse direto num arquivo, um banco faz mais do que gravar.

2º)Como falei anteriormente, ja chequei a desconectar e conectar para ver se aumentava a performance

3º)Exemplifiquei 300 linhas para dar o commit, só para retirar essa questão da pauta, pois com ou sem a performance
degride com o tempo.

Não queria usar o Derby, JavaDB, ou qualquer outro, queria usar o hsql.

Gostaria que alguem que soubesse de algum parametro
magico para a base HSQLDB, ou tratamento , me respondesse…

muito obrigado a todos que responderam,

Abs,

amigo nao conheco hsqldb, mais acho q vc teria q estudar um pouco sobre o banco em questao como ele trata os arquivos como esta sendo armazenado na memoria, etc… 650.000 mil nao eh um numero mto elevado, teria q ter uma performance boa, vc precisa fazer essa carga soh uma vez? ou varias vezes?

dependendo se for soh uma vez nao tem problema vc pode carrega-lo em um horario de pouco uso e deixar carregando tudo… caso contrario, aconselho a usar outro banco de dados, pq esse ai nao vai te ajudar mto nao

vlws

Se queres tanto usar o HSQLDB, pergunte aos developers, foi o q fiz quando deparei com um problema crucial no H2DataBase a 2 anos atrás, falei com o developer principal e ele me deu a solução e o código q corrigia o bug em menos de 2h :stuck_out_tongue:

É galera,
resolvi o problema…
usei addBatch()
e fiz tudo de uma só vez,
ai consegui num tempo aceitavel a inserção…
respondendo a pergunta que o gzofera fez, 650000 é pouco mesmo
e é só uma vez que eu insiro, só que a situação já ficava complicada nos 6000 primeiros
registros !!!
mais agora ta tudo resolvido, guardei meus POJOS em memória
e fiz por batch no final de tudo,
uma maravilha

Abs!!!

[quote=dyorgio]É galera,
resolvi o problema…
usei addBatch()
e fiz tudo de uma só vez,
ai consegui num tempo aceitavel a inserção…
respondendo a pergunta que o gzofera fez, 650000 é pouco mesmo
e é só uma vez que eu insiro, só que a situação já ficava complicada nos 6000 primeiros
registros !!!
mais agora ta tudo resolvido, guardei meus POJOS em memória
e fiz por batch no final de tudo,
uma maravilha

Abs!!![/quote]

Pois é… foi o q eu disse…

Eu já passei por isso a uns anos atrás… ficava fazendo commit para cada insert… isto não se faz! Junta tudo no batch e depois comita tudo de uma vez e a DB se vira!

Agora vc nunca mais esquece, como eu… nunca mais esqueci, mas levei muito na cabeça :stuck_out_tongue:

E outra dica basica, não fique abrindo e fechando conexões, abra apenas uma e reutilize a mesma até o fim para tudo q for fazer, mas esta já deves saber :wink:

A tabela em que vc. está inserindo possui algum tipo de PK ou índice ?
Neste caso, o tempo de insert sempre vai decair com o tempo, já que, a cada insert, o banco tem que checar os registros existentes para verificar se há violação de alguma chave única.

Uma possibilidade é vc. criar a tabela sem nenhum tipo de índice, inserir tudo e, no final, criar os índices necesários.

Outra opção é vc. utilizar Text Tables (http://hsqldb.sourceforge.net/doc/guide/ch06.html).

[quote=dyorgio]1º) Seria natural cair tanto se eu gravasse direto num arquivo, um banco faz mais do que gravar.

2º)Como falei anteriormente, ja chequei a desconectar e conectar para ver se aumentava a performance

3º)Exemplifiquei 300 linhas para dar o commit, só para retirar essa questão da pauta, pois com ou sem a performance
degride com o tempo.

Não queria usar o Derby, JavaDB, ou qualquer outro, queria usar o hsql.

Gostaria que alguem que soubesse de algum parametro
magico para a base HSQLDB, ou tratamento , me respondesse…

muito obrigado a todos que responderam,

Abs,[/quote]

Cara, como mencionei tentei não criar nenhum indice ou constraint,
mas mesmo assim o HSQLDB não aguentava
ai eu resolvi temporariamente usando BATCH`s
só que agora eu resolvi da maneira correta :stuck_out_tongue:
troquei para H2, como alguns ai me aconselharam…
realmente ficou perfeito, e é totalmente compativel com o HSQLDB
menos alguns errorCodes, mais foi preciso poucos, quase nenhum,
ajuste no meu framework, de quebra ficou tudo mais rapido no sistema…
uso, inicialização e finalização

então ai vai a dica, HSQLDB é pra quem quer fazer uma base pra pouco
conteudo, até porque a do H2 ficou maior…

Mais velocidade, standalone, 100% Java, free… é com o H2 database

aleluia irmãos!!! aleluia

P.S.: JavaDB é triste…que tristeza :smiley: :smiley: :smiley:

H2 database é um projeto do mesmo criador do Hypersonic, o projeto que deu inicio ao HSQLDB ( na verdade o Hypersonic parou e um grupo pegou e continuou com o nome de HSQLDB ). Mesmo sendo compatível com HSQLDB, não compartilha nenhum código sendo reescrito do zero. Particulamente gosto mais do H2 como banco embarcado, apesar do Derby ser bem interessante.

Até!