Como fazer varios updates? sem demorar uma eternidade?

5 respostas
jingle

pessoal to com um problema…
tenho que fazer cerca de 1065780 (sim esse numero mesmo) de update no banco…

Tenho um select que vai me trazer aquela quantidade de linhas e preciso alterar sempre o mesmo campos dela com valores incremental

exemplo do select traz…
nome |chave
rafael | 0
testel | 0
testrr | 0

e vou ter que mudar esses zeros para um valor incremental fincando assim:
nome |chave
rafael | 1
testel | 2
testrr | 3

mas o problema que é aquele numero grotesto de alterações que meu select traz… (e este campo não pode ser autoincremental do banco mesmo)

primero problema que tive foi que ao trazer fazer o select o resultset dava java heap space… fiz um limite para fazer em grupos de 5000 por vez… mas agora esse processo demora uma eternidade…

banco que uso é o postgre. alguém já teve que fazer algo parecido?

5 Respostas

T

Se o banco for Oracle, por exemplo, acho que dá para resolver em um simples Update.

Por acaso esses números seqüenciais podem ser ao acaso (ou seja, em qualquer ordem que o Select trouxer os dados) ou você dava um “order by” nesse select antes de atribuir os números seqüenciais?

jingle

não importa a ordem…

T

Será que isto funcionaria? Não tenho um PostgreSQL para testar.

http://www.postgresql.org/docs/7.4/static/functions-sequence.html
http://www.postgresql.org/docs/7.4/static/sql-createsequence.html

create sequence bla;

update tabela set chave = nextval ('bla');
Adolfo_Rodrigues

E se você precisar os trilhões de updates mesmo, faça em blocos (como você disse que já havia tentado) e use um PreparedStatement.

http://java.sun.com/docs/books/tutorial/jdbc/basics/prepared.html
http://java.sun.com/j2se/1.4.2/docs/api/java/sql/PreparedStatement.html

jingle

Adolfo Rodrigues:
E se você precisar os trilhões de updates mesmo, faça em blocos (como você disse que já havia tentado) e use um PreparedStatement.

http://java.sun.com/docs/books/tutorial/jdbc/basics/prepared.html
http://java.sun.com/j2se/1.4.2/docs/api/java/sql/PreparedStatement.html

é deste modo que estou fazendo… estou utilizando o addBatch() para fazer somente de 5000 em 5000 mas quando chega no executeBatch(); demora demais =/

vou ver se mexendo nos indices aqui não vai melhorar…

E gostei da saida do thingol vou ver se tenho como usa ela no meu caso…

Criado 11 de junho de 2008
Ultima resposta 11 de jun. de 2008
Respostas 5
Participantes 3