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;


Responder a