Procedure Lenta quando utilizo variáveis

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
deiver.ceroni
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qui, 13 Jun 2013 5:27 pm

Boa noite Pessoal!

Estou com um problema quando executo uma procedure e utilizo variáveis de paramâmetro para o cursor!

Selecionar tudo

DECLARE      
  CURSOR C_DADOS( V_CLIENTE NUMBER, V_ID_INI  NUMBER) IS        
            select  *
             from    lms_pd.docto_servico ds                     
                     inner join lms_pd.evento_documento_servico eds  on (eds.id_docto_servico = ds.id_docto_servico) 
             /*                                                                       
             where    ds.id_cliente_remetente = 206116 and 
                      eds.id_evento_documento_servico > 568650757         
         
             */                          
             where    ds.id_cliente_remetente = V_CLIENTE 
                          AND eds.id_evento_documento_servico > V_ID_INI         
                                                           
             order by eds.id_evento_documento_servico;    

  R_DADOS C_DADOS%ROWTYPE;
 BEGIN
         OPEN C_DADOS(206116,568102156);
         LOOP        
         FETCH C_DADOS INTO R_DADOS;
         EXIT WHEN C_DADOS%NOTFOUND;         
         DBMS_OUTPUT.put(R_DADOS.CD_EMPRESA);
         DBMS_OUTPUT.put_line(R_DADOS.NU_NOTA_FISCAL);         
         END LOOP;      
         CLOSE C_DADOS;  
  END;
  
Se eu colocar os valores fixos o retrorno é muito rápido, mas se colocar com as variáveis fica muito lento!

Alguém sabe o que pode ser?

Obrigado!
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Hum,

Estas colunas que você faz as filtragens estão indexadas na sua base de dados?

Não saberia exatamente explicar o motivo da demora de execução de sua querie.

Porque você não faz uma tentativa com SQLDINAMICO para ver se a performance melhora?

Este é um exemplo de um manual da oracle (http://docs.oracle.com/cd/B19306_01/app ... ynamic.htm). Talvez você possa adaptar para o seu caso:

Selecionar tudo

DECLARE
   TYPE EmpCurTyp IS REF CURSOR;
   emp_cv   EmpCurTyp;
   emp_rec  employees%ROWTYPE;
   sql_stmt VARCHAR2(200);
   v_job   VARCHAR2(10) := 'ST_CLERK';
BEGIN
   sql_stmt := 'SELECT * FROM employees WHERE job_id = :j';
   OPEN emp_cv FOR sql_stmt USING v_job;
   LOOP
     FETCH emp_cv INTO emp_rec;
     EXIT WHEN emp_cv%NOTFOUND;
     DBMS_OUTPUT.PUT_LINE('Name: ' || emp_rec.last_name || ' Job Id: ' ||
                           emp_rec.job_id);
   END LOOP;
   CLOSE emp_cv;
END;
/

Talvez os fortistas possam ajudar com outras sugestões.]


Abraços,

Sergio Coutinho
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

@deiver.ceroni,

É Oracle 10G? Se sim, você está tendo problemas com as variáveis bind porque provavelmente o Oracle não está conseguindo fazer bind peeking e consequentemente utilizar índices para otimizar a consulta. Quando você põe os valores fixos, o Oracle consegue fazer isso! No 11G existe uma nova feature chamada Adaptive Cursor que normalmente resolve este problema.

Veja se o parâmetro CURSOR_SHARING do seu Bd está com valor diferente de EXACT?

[]s
deiver.ceroni
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qui, 13 Jun 2013 5:27 pm

O problema foi solucionado!

Foi exatamente o que fbifabio falou!

Vlw pela ajuda pessoal!
Responder
  • Informação