Estou 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. Startei 16 sessões diferentes no servidor, cada uma executando um grupo de sequências, processando paralelamente a mesma rotina, pra cartões diferentes.
O grande problema é que esta executando fazem mais de 70 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_Achou NUMBER(1);
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;
v_achou := 0;
--
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
--
SELECT 1 INTO v_Achou
FROM SNCCR
WHERE SNCCR.CRTNUM = r_Crt.crtnum
AND SNCCR.APLCOD = '02001'
AND SNCCR.CCRCMPRULTDAT IS NULL
AND SNCCR.CCRCMPRULTVLR IS NULL
AND SNCCR.CCRCRDULTDAT IS NULL
AND SNCCR.CCRCRDULTVLR IS NULL;
--
IF v_Achou = 1 THEN
--
-- 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;
--
v_Achou := 0;
--
END IF;
--
END;
--
END LOOP;
--
IF v_qtd_registros <> 0 THEN
COMMIT;
END IF;
--
END;