Pular para o conteúdo
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #89542
    facc
    Participante

      Bom 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.

      #89543
      Ishii
      Participante

        Olá,

        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

        #89545
        facc
        Participante

          Entã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.

          #89546
          fsitja
          Participante

            Posta 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');

            #89547
            facc
            Participante

              Entã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.

              #89549
              Manoel872
              Participante

                Amigo 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

                #89557
                facc
                Participante

                  Irei pedir para o DBA refazer a analize da performance.

                  Depois posto o resultado.

                  Muito obrigado a todos.

                Visualizando 7 posts - 1 até 7 (de 7 do total)
                • Você deve fazer login para responder a este tópico.