- Este tópico contém 6 respostas, 4 vozes e foi atualizado pela última vez 16 anos, 6 meses atrás por
facc.
-
AutorPosts
-
9 de setembro de 2009 às 6:16 pm #89542
facc
ParticipanteBom dia, venho mais uma vez pedir ajuda a vocês.
Tenho essa procedure, e o DBA onde meu BD está hospedado informou que está consumindo muita memória. Alguém poderia analizar e me retornar como melhorar a performance? Obs. Não posso alterar os parametros de entrada nem de saida
A procedure:
CREATE OR REPLACE PROCEDURE CYBELAR_VER_NRSORTE(P_LOJA IN VARCHAR2,
P_NRPDV IN VARCHAR2,
P_QTDNRSORTE IN NUMBER,
P_RETORNO OUT NUMBER) is
/*************************************************************
* PROCEDURE : CYBELAR_VER_NRSORTE *
* OBJETIVO : VERIFICAR SE POSSUI NRSORTE P/ A LOJA "LIVRES" *
NA QTDD PEDIDA, CASO POSITIVO RETORNA 1, CASO *
NEGATIVO RETORNA 0 *
* CRIACAO : 13/05/2009 *
* VERSAO : 1.0 *
* AUTOR : FABIO A. CAMPOS CRUZ - fabioc@*********.com.br *
*************************************************************/RETORNO NUMBER;
ERRO_INT VARCHAR2(1000);
VC_DIR_LOG VARCHAR2(100);
VC_ID_LOG VARCHAR2(7) := 'CYBELAR';
VC_ARQ_LOG VARCHAR2(15) := 'VERNRSORTE.LOG';
VG_PROCESSO VARCHAR2(50) := 'VER_NRSORTE';
VU_FILE UTL_FILE.file_type;VN_QTREG NUMBER := 0;
CURSOR CUR_NRSORTE IS
SELECT ROWID, NROSORTE
FROM CYBELAR_NROSORTE
WHERE FLGUSO = 0
OR LOJA IS NULL
OR LOJA = ''
AND TO_CHAR(MES_ANO, 'YYYYMM') = TO_CHAR(ADD_MONTHS(SYSDATE, 1), 'YYYYMM');RES CUR_NRSORTE%ROWTYPE;
BEGIN
BEGIN
SELECT PINT_NM_DIRETORIO_LOG
INTO VC_DIR_LOG
FROM GEMCO_PARAMETRO_INTERFACE PINT, GEMCO_SISTEMA SIST
WHERE PINT.PINT_CD_SISTEMA = SIST.SIST_CD_SISTEMA
AND SIST.SIST_DS_SISTEMA = VG_PROCESSO;
EXCEPTION
-- SE NAO EXISTIR INFORMAR O DIRETORIO ONDE DEVERA SER
-- GERADO O LOG DE OCORRENCIAS
WHEN NO_DATA_FOUND THEN
VC_DIR_LOG := '/integra/Log';
WHEN TOO_MANY_ROWS THEN
VC_DIR_LOG := '/integra/Log';
WHEN OTHERS THEN
VC_DIR_LOG := '/integra/Log';
END;BEGIN
VU_FILE := UTL_FILE.fopen(VC_DIR_LOG, VC_ARQ_LOG, 'r');
UTL_FILE.FCLOSE(VU_FILE);
EXCEPTION
WHEN OTHERS THEN
sp_int_gemco_gera_log('INICIO DO LOG',
VC_DIR_LOG,
VC_ID_LOG,
VC_ARQ_LOG,
SYSDATE,
NULL,
VG_PROCESSO,
0,
0,
0);
END;
sp_int_gemco_gera_log('GERA LOG',
VC_DIR_LOG,
VC_ID_LOG,
VC_ARQ_LOG,
SYSDATE,
'INICIO DO LOG',
VG_PROCESSO,
0,
0,
0);
OPEN CUR_NRSORTE;
LOOP
FETCH CUR_NRSORTE
INTO RES;
IF CUR_NRSORTE%NOTFOUND THEN
EXIT;
END IF;
VN_QTREG := VN_QTREG + 1;
END LOOP;IF VN_QTREG < P_QTDNRSORTE THEN RETORNO := 0; ELSE RETORNO := 1; END IF; CLOSE CUR_NRSORTE; P_RETORNO := RETORNO; END CYBELAR_VER_NRSORTE;
O acesso a essa procedure é feita através de uma página ASP desenvolvida por uma empresa terceirizada.
Agradeço desde já qualquer ajuda.9 de setembro de 2009 às 6:35 pm #89543Ishii
ParticipanteOlá,
A query do cursor consome muita memória também? Ou melhor, seria somente o consumo de memória ou I/O ou outra informação mais relevante do DBA sobre o problema desta procedure?
[]s Ishii
9 de setembro de 2009 às 6:40 pm #89545facc
ParticipanteEntão, segundo o relatório que o DBA me forneceu, a procedure está consumindo muito tempo de memória.
Caso necessário, posto o relatório aqui.
9 de setembro de 2009 às 6:48 pm #89546fsitja
ParticipantePosta um plano de execução da query também:
SELECT ROWID, NROSORTE
FROM CYBELAR_NROSORTE
WHERE FLGUSO = 0
OR LOJA IS NULL
OR LOJA = ''
AND TO_CHAR(MES_ANO, 'YYYYMM') = TO_CHAR(ADD_MONTHS(SYSDATE, 1), 'YYYYMM');
9 de setembro de 2009 às 6:59 pm #89547facc
ParticipanteEntão, essa procedure é executada para saber se possui a quantidade solicitada pela loja para a venda, retornando se pode continuar a venda ou não.
Resumindo ele faz um count no banco (de acordo com as clausulas where) e compara com a qtdd informada pela loja.
9 de setembro de 2009 às 8:26 pm #89549Manoel872
ParticipanteAmigo boa tarde.
Acredito que talvez você ao inves de usar esse loop resolva isso dessa forma.
Retirar:
OPEN CUR_NRSORTE;
LOOP
FETCH CUR_NRSORTE
INTO RES;
IF CUR_NRSORTE%NOTFOUND THEN
EXIT;
END IF;
VN_QTREG := VN_QTREG + 1;
END LOOP;Colocar:
SELECT COUNT(1) into VN_QTREG
FROM CYBELAR_NROSORTE
WHERE FLGUSO = 0
OR LOJA IS NULL
OR LOJA = ”
AND TO_CHAR(MES_ANO, ‘YYYYMM’) = TO_CHAR(ADD_MONTHS(SYSDATE, 1), ‘YYYYMM’);Isso talvez melhore o desempenho.
Att,
Manoel Jr
10 de setembro de 2009 às 4:27 pm #89557facc
ParticipanteIrei pedir para o DBA refazer a analize da performance.
Depois posto o resultado.
Muito obrigado a todos.
-
AutorPosts
- Você deve fazer login para responder a este tópico.