Este cara é master em PL/SQL.

Procure artigos dele sobre processamento grande como o seu.

http://apex.oracle.com/pls/otn/f?p=2853:1:1222472418458132

2009/3/2 Júlio César Corrêa <juliotubi...@yahoo.com.br>

> Estes parametros recebem um valor unico?Ou muda a cada execução.Você pelo
> jeito está fazendo processamento linha a linha ok?
>
> Olhando a sua procedure.Você poderia analisar se somente conseguiria isso
> com SQL?
> De uma pesquisada e tente simplificar o caso.Se é um UPDATE,isto SQL.
> Mesmo que você vai fazer um UPDATE com base em uma condição,mesmo assim
> ainda dá para usar somente SQL.
>
>
> Caso não,veja se suas queries SQL buscam registros com a mesma
> condição.Neste caso poderia agrupar ele em uma coleção.E fazer update usando
> as coleções.
>
>
>
>
>
>
> 2009/3/2 Júlio César Corrêa <juliotubi...@yahoo.com.br>
>
> Vou ver um tempinho daki apoko e dou uma resposta..uma opnião ok?
>> Há situações que se tem 1,2 ou mais formas de fazer a mesma coisa.Vou dar
>> uma analisada e ver se posso ajudar.
>>
>> 2009/3/2 odelar <ode...@yahoo.com>
>>
>>    Bom dia, pessoal.
>>> Estou com uma aplicação executando uma atualização, onde busco
>>> informações em uma tabela de transações com aproximandamente uns 10
>>> milhões de linhas (ultima compra/credito) e faço um update em outra
>>> tabela com 1,5 de linhas.
>>>
>>> Criei uma tabela onde tenho o numero dos cartões e uma sequencia,
>>> assim consigo executar o mesmo processo simultaneamente no banco.
>>>
>>> O grande problema é que esta executando fazem mais de 40 horas e
>>> ainda não acabou! Preciso urgente de uma ajuda!!!!
>>>
>>> Alguém pode me ajudar?
>>>
>>> Segue dados e processo abaixo:
>>>
>>> Banco: Oracle 10g
>>>
>>> CREATE OR REPLACE PROCEDURE Atualizar_Snccr( p_Seq1 GRUPO_SNCCR.SEQ%
>>> TYPE
>>> , p_Seq2 GRUPO_SNCCR.SEQ%
>>> TYPE ) IS
>>> --
>>> CURSOR c_Comp(pc_CrtNum SNCRT.CRTNUM%TYPE) IS
>>> SELECT /*+ INDEX(SNTRN,ISNTRN19) */ SNTRN.TRNDAT, SNTRN.TRNVAL
>>> FROM SNTRN
>>> WHERE SNTRN.TRNPRECRT = pc_CrtNum
>>> AND SNTRN.TRNPRCCOD IN (240000,241000,770000,778000)
>>> AND SNTRN.TRNDAT = (SELECT /*+ INDEX(SNTRN,ISNTRN19) */ MAX
>>> (SNTRN.TRNDAT)
>>> FROM SNTRN
>>> WHERE SNTRN.TRNPRECRT = pc_CrtNum
>>> AND SNTRN.TRNPRCCOD IN
>>> (240000,241000,770000,778000));
>>> --
>>> CURSOR c_Cred(pc_CrtNum SNCRT.CRTNUM%TYPE) IS
>>> SELECT /*+ INDEX(SNTRN,ISNTRN20) */ SNTRN.TRNDAT, SNTRN.TRNVAL
>>> FROM SNTRN
>>> WHERE SNTRN.TRNSUBCRT = pc_CrtNum
>>> AND SNTRN.TRNPRCCOD IN (620000,621000,625000)
>>> AND SNTRN.TRNDAT = (SELECT /*+ INDEX(SNTRN,ISNTRN20) */ MAX
>>> (SNTRN.TRNDAT)
>>> FROM SNTRN
>>> WHERE SNTRN.TRNSUBCRT = pc_CrtNum
>>> AND SNTRN.TRNPRCCOD IN
>>> (620000,621000,625000));
>>> --
>>> r_TrnDat_Comp SNTRN.TRNDAT%TYPE;
>>> r_TrnVal_Comp SNTRN.TRNVAL%TYPE;
>>> r_TrnDat_Cred SNTRN.TRNDAT%TYPE;
>>> r_TrnVal_Cred SNTRN.TRNVAL%TYPE;
>>> r_CrtNum SNCRT.CRTNUM%TYPE;
>>> --
>>> v_Cod_Em FJCFJ.CFJSEQ%TYPE;
>>> --
>>> v_qtd_registros NUMBER(10);
>>> --
>>> BEGIN
>>> --
>>> -- inicializa variaveis
>>> r_TrnDat_Comp := TO_DATE('01/01/0001','DD/MM/YYYY');
>>> r_TrnVal_Comp := 0;
>>> r_TrnDat_Cred := TO_DATE('01/01/0001','DD/MM/YYYY');
>>> r_TrnVal_Cred := 0;
>>> v_qtd_registros := 0;
>>> --
>>> -- Agrupamento de cartoes por RH/Filial/Matricula
>>> FOR r_Crt IN (SELECT SEQ
>>> , CRTNUM
>>> FROM GRUPO_SNCCR
>>> WHERE GRUPO_SNCCR.SEQ BETWEEN p_Seq1 AND p_Seq2
>>> AND GRUPO_SNCCR.PROCESSADO = 0 )
>>> LOOP
>>> --
>>> -- busca dados da ultima compra e atualiza
>>> BEGIN
>>> --
>>> -- busca dados da ultima compra e atualiza
>>> OPEN c_Comp(r_Crt.crtnum);
>>> FETCH c_Comp INTO r_TrnDat_Comp, r_TrnVal_Comp;
>>> CLOSE c_Comp;
>>> --
>>> -- busca dados do ultimo credito e atualiza
>>> OPEN c_Cred(r_Crt.crtnum);
>>> FETCH c_Cred INTO r_TrnDat_Cred, r_TrnVal_Cred;
>>> CLOSE c_Cred;
>>> --
>>> UPDATE SNCCR
>>> SET SNCCR.CCRCMPRULTDAT = r_TrnDat_Comp
>>> , SNCCR.CCRCMPRULTVLR = r_TrnVal_Comp
>>> , SNCCR.CCRCRDULTDAT = r_TrnDat_Cred
>>> , SNCCR.CCRCRDULTVLR = r_TrnVal_Cred
>>> WHERE SNCCR.CRTNUM = r_Crt.crtnum
>>> AND SNCCR.APLCOD = '02001';
>>> --
>>> v_qtd_registros := v_qtd_registros + 1;
>>> --
>>> -- Zera variaveis de data e valor, para o proximo cartao
>>> r_TrnDat_Comp := TO_DATE('01/01/0001','DD/MM/YYYY');
>>> r_TrnVal_Comp := 0;
>>> r_TrnDat_Cred := TO_DATE('01/01/0001','DD/MM/YYYY');
>>> r_TrnVal_Cred := 0;
>>> --
>>> UPDATE GRUPO_SNCCR
>>> SET GRUPO_SNCCR.PROCESSADO = 1
>>> , GRUPO_SNCCR.GCRATUDAT = SYSDATE
>>> WHERE GRUPO_SNCCR.SEQ = r_Crt.Seq
>>> AND GRUPO_SNCCR.CRTNUM = r_Crt.CrtNum;
>>> --
>>> IF v_qtd_registros = 1000 THEN
>>> COMMIT;
>>> v_qtd_registros := 0;
>>> END IF;
>>> --
>>> END;
>>> --
>>> END LOOP;
>>> --
>>> IF v_qtd_registros <> 0 THEN
>>> COMMIT;
>>> END IF;
>>> --
>>> END;
>>>
>>>  
>>>
>>
>>
>>
>> --
>> Júlio César Corrêa
>> IS Technologist - Oracle DBA
>> http://jccorrea.blogspot.com
>>
>> “To stay competitive in the tech industry, never stop
>> learning. Always be on the lookout for better ways of
>> doing things and new technologies. Our industry does
>> not reward people who let themselves stagnate”
>> –John Hall, Senior Vice President, Oracle University
>>
>>
>
>
> --
> Júlio César Corrêa
> IS Technologist - Oracle DBA
> http://jccorrea.blogspot.com
>
> “To stay competitive in the tech industry, never stop
> learning. Always be on the lookout for better ways of
> doing things and new technologies. Our industry does
> not reward people who let themselves stagnate”
> –John Hall, Senior Vice President, Oracle University
>
>


-- 
Júlio César Corrêa
IS Technologist - Oracle DBA
http://jccorrea.blogspot.com

“To stay competitive in the tech industry, never stop
learning. Always be on the lookout for better ways of
doing things and new technologies. Our industry does
not reward people who let themselves stagnate”
–John Hall, Senior Vice President, Oracle University


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



------------------------------------

--------------------------------------------------------------------------------------------------------------------------
>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--------------------------------------------------------------------------------------------------------------------------
>Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » 
>Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>http://www.oraclebr.com.br/  
------------------------------------------------------------------------------------------------------------------------
 Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/oracle_br/

<*> Para sair deste grupo, envie um e-mail para:
    oracle_br-unsubscr...@yahoogrupos.com.br

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html


Responder a