Substitua o cursor por um cursor com bulk collection e utilize um forall no
lugar do for....



2008/6/19 Usina Mandu S/A - Renato Ricci <[EMAIL PROTECTED]>:

>   Cara, uma coisa que ajuda muito é desativar todos os índices da tabela2,
> pois a cada update que o oracle dá ele automaticamente atualiza a arvore de
> índices, ou seja, se vc for dar 15000 updates em uma tabela, ele ira
> atualizar 15000 vezes os índices, consumindo recurso da maquina.
>
> Tente desabilitar os índices, fazer a migração, depois criar os índices
> novamente.. Com certeza vc terá um ganho de perfomence..
>
> Outra coisa que vc pode estar utilizando é o comando MERGE.. de uma olhada
> no google de como utilizá-lo.
>
> Abraço,
>
> _______________________________________
>
> Renato Ribeiro Ricci
>
> Analista de Sistemas
>
> _____
>
> De: oracle_br@yahoogrupos.com.br <oracle_br%40yahoogrupos.com.br> [mailto:
> oracle_br@yahoogrupos.com.br <oracle_br%40yahoogrupos.com.br>] Em
> nome de euripedes.junior
> Enviada em: quarta-feira, 18 de junho de 2008 14:33
> Para: oracle_br@yahoogrupos.com.br <oracle_br%40yahoogrupos.com.br>
> Assunto: [oracle_br] Problema com atualização pesada em tabela
>
>
> Olá pessoal tudo bom????
>
> Bom tenho uma dúvida eu preciso atualizar um campo tabela x com
> referencia ao campo da tabela y. Meu problema é o seguinte está
> demorando muito pra finalizar a procedure. Eu estou pegando os
> resultados da tabela y e jogando para um cursor do tipo ROWTYPE e
> depois estou colocando o UPDATE dentro de um LOOP para atualizar a
> tabela x, não sei se essa e a melhor forma de fazer, as segestões q
> vcs tiverem eu agradeco.
>
> ##### INFO TABELAS #####
>
> TABELA1 (17598 Linhas)
>
> Tabela2 (17045 Linhas)
>
> ##### PROCEDURE #####
>
> create or replace
> PROCEDURE "TESTE" AS
> BEGIN
> DECLARE
>
> COUNTER NUMBER := 0;
> CURSOR c_sb IS
>
> SELECT B1_COD, B1_CUTMAN
> FROM TABELA1
> WHERE B1_TIPO IN ('01','02','03','04');
> atualiza c_sb%ROWTYPE;
>
> BEGIN
>
> OPEN c_sb;
> LOOP
> FETCH c_sb INTO atualiza;
> EXIT WHEN c_sb%NOTFOUND;
>
> COUNTER := COUNTER + 1;
>
> UPDATE TABELA2 TB2 SET
> TB2.B9_CUTMAN = atualiza.B1_CUTMAN
> WHERE TB2.B9_DATA = '20080131'
> AND TB2.B9_COD = atualiza.B1_COD;
>
> IF COUNTER > 1000 THEN
> COUNTER := 0;
> COMMIT;
> END IF;
>
> END LOOP;
> CLOSE c_sb;
> END;
> COMMIT;
> END TESTE;
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>



-- 
Thiago Azevedo
Accenture Brazil
Services - AO Carrefour
Work: 55 11 51888492
Mobile: 55 13 81453524
email: [EMAIL PROTECTED]
MSN IM: [EMAIL PROTECTED]


[As partes desta mensagem que não continham texto foram removidas]

Responder a