Boa tarde galera
Preciso importar um arquivo que terá +/- 5 milhões de registros em txt. (sei que é absurdo, mas é solicitação do cliente =/ )
Qual seria a melhor forma? inserir em lote com JDBC?
abraço
Boa tarde galera
Preciso importar um arquivo que terá +/- 5 milhões de registros em txt. (sei que é absurdo, mas é solicitação do cliente =/ )
Qual seria a melhor forma? inserir em lote com JDBC?
abraço
Sim essa é a melhor alternativa. Utilizar BatchInsert vai melhor a performance e diminuir o risto de problemas de memória.
Recomendo fazer um IMPORT direto na base. Vai ser bem mais rápido que fazer via JDBC, mas pra isso, antes a pergunta a seguir precisar ser respondida com sim:
Você possui acesso ao banco de dados que precisa realizar a carga?
Qual é o formato dos registros no arquivo? Você terá que pensar, também, em como vai carregar isso para mandar importar.
Vocẽ tambem poderia utilizar a ferramenta Ketle para fazer isso de forma mais facil, mais você precisaria conhecer primeiro a ferramenta.
O grande problema de inserir muitos registros em um banco de dados usando a instrução INSERT (mesmo sendo um BATCH INSERT ou um BATCH UPDATE), em vez de usar um utilitário do banco de dados, é que isso costuma ser muito mais lento porque:
a) o INSERT normalmente participa de uma transação (implícita ou explicita) - ou seja, isso cria entradas no “journal” do banco de dados
b) Normalmente o INSERT também atualiza os índices da tabela (ou tabelas, se algum índice envolver “views” materializadas com múltiplas tabelas)
Para acelerar esse processo, normalmente costuma ser muito mais rápido importar os dados com o utilitário do banco, e talvez dropar os índices antes da importação e recriá-los depois da importação - isso depende muito do banco.
Como os amigos acima disseram um boa opção é usar o Banco pra fazer essa importação de dados. Mais como acredito que vá envolver regras de negócio, tem que ver essa possibilidade.
guilherme_costa, em relação a pergunta a resposta é sim, mas como assim fazer um import direto no banco?
surfzera, foi cogitada a possibilidade de usar o ketle, mas não foi aprovado pelo tempo de aprendizado…
Ataxexe, o arquivo só terá 3 campos.
Seria melhor então usar um utilitário do banco de dados devido a performace?
abç
[quote=giselezr]guilherme_costa, em relação a pergunta a resposta é sim, mas como assim fazer um import direto no banco?
surfzera, foi cogitada a possibilidade de usar o ketle, mas não foi aprovado pelo tempo de aprendizado…
Ataxexe, o arquivo só terá 3 campos.
Seria melhor então usar um utilitário do banco de dados devido a performace?
abç[/quote]
Gisele,
Segue abaixo o exemplo do utilitário IMPORT que utilizo no DB2:
IMPORT FROM funcionarios.asc OF ASC
MESSAGES funcionarios.log
INSERT_UPDATE INTO FOLHA.FUNCIONARIOS
Onde funcionarios.asc é o meu arquivo txt com os registros que serão carregados com a codificação ASCII.
[quote=surfzera]O grande problema de inserir muitos registros em um banco de dados usando a instrução INSERT (mesmo sendo um BATCH INSERT ou um BATCH UPDATE), em vez de usar um utilitário do banco de dados, é que isso costuma ser muito mais lento porque:
a) o INSERT normalmente participa de uma transação (implícita ou explicita) - ou seja, isso cria entradas no “journal” do banco de dados
b) Normalmente o INSERT também atualiza os índices da tabela (ou tabelas, se algum índice envolver “views” materializadas com múltiplas tabelas)
Para acelerar esse processo, normalmente costuma ser muito mais rápido importar os dados com o utilitário do banco, e talvez dropar os índices antes da importação e recriá-los depois da importação - isso depende muito do banco. [/quote]
+1
Lendo a EF novamente percebi que terá que ter um relatório de erro e sera preciso fazer algumas validações de regra de negocio, então dessa forma acho que não vou poder inserir direto no banco =/
Na verdade a ideia foi a seguinte, ler o arquivo e jogar tudo em uma tabela “temporaria” no banco sem validação para não ficar tantos registros em memoria e depois ir buscar esses registros no banco, em lote também, fazer as validações e inserir na tabela correta.
O que vcs acham?
Trabalho com importação de dados aqui na empresa e utiliza a ferramenta Talend TOS, é bem fácil de usar, só clicar e arrastar, e como ela é feita em java, podem ser feitas as validações necessárias. Essa ferramenta funciona basicamente assim: Componente de entrada (excel, txt, ou algum banco de dados), componente de tratamento e componente de saída (tabela do banco pra onde irá as informações).
[quote=giselezr]Lendo a EF novamente percebi que terá que ter um relatório de erro e sera preciso fazer algumas validações de regra de negocio, então dessa forma acho que não vou poder inserir direto no banco =/
Na verdade a ideia foi a seguinte, ler o arquivo e jogar tudo em uma tabela “temporaria” no banco sem validação para não ficar tantos registros em memoria e depois ir buscar esses registros no banco, em lote também, fazer as validações e inserir na tabela correta.
O que vcs acham?[/quote]
Qual é o banco de dados ? Oracle, DB2, Mysql ???
Se for oracle recomendo utilizar o loader dele que é rápido e bem tranquilo de usar, se você estiver usando uma IDE que acessa o BD oracle por exemplo o PLSQL developer também tem um importador de arquivos , o SQL developer da oracle também é tranquilo de se fazer isto.
Quanto a validar a regra de negócio , acredito que o ideal é importar os dados e depois efetuar os respectivos processos de validação das regras de negócio … existem muitas maneiras de se fazer isto … sql puro, procedures , functions , etc…
Se for via app é legal mas se for apenas uma vez não faz sentido nenhum criar uma aplicação para isto …procure pelos utilitários dos SGBD … cada um tem seus programas especificos para importar dados … 5 milhões é merreca !!! se pensarmos hoje em dia …boa sorte …
Antes de ficar pirando, existe algum tipo de prazo máximo que esses dados devam ser importados?
Por que o batch insert não será problema se você puder deixar a aplicação trabalhando por… um final de semana inteiro?
Ótima pergunta.
E reforçando essa pergunta, são 5milhões de linhas, mas quantas colunas?Uma app que só importa meia dúzia de campos sem validação e outra com uns 50 com validação de entrada tem uma diferença de tempo gritante.
giselezr,
tenho uma app aqui que faz rotineiramente aqui import de quase 100mil linhas(e mais de 50 campos) com validação(corta maiores que tal número,diferentes de outro…) e o tempo é inferior a 10 segundos(claro, numa máquina i7 com 16GB de RAM e SSD) no Oracle 10g XE.Uso o Flatpack com o BatchUpdate.O único senão, é aumentar a memória da JRE devido ao excesso de verificações durante o import para evitar o OutOfMemoryError.
Eu falei nas restrições de tempo porque 5 milhões de registros em 48 horas de um final de semana representa uma taxa de 29 registros por segundo. O que é bem razoável para a maioria dos bancos de dados.