Lentidão utilizando parâmetro

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
everthon
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 14
Registrado em: Qua, 18 Jan 2012 2:43 pm
att,

Everthon Souza
Em Deus, posso todas as coisas!

Boa tarde pessoal, beleza?

Estou com um problema e sinceramente não tenho mais ideia do que fazer, é o seguinte:

Tenho um bloco muito simples, onde abro um cursor e apresento as informações utilizando "dbms_output.put_line".
Quando executo meu bloco utilizando meus parâmetros "cravados" na query, o tempo de execução é de 10 a 15 segundos em média, mas quando passo um parâmetro para a query o tempo de execução sobre para 2 minutos e meio.

Sei que o plano de execução muda quando executo das duas maneiras, mas tanto assim? Achei bem estranho.

Os tipos de dados entre campo e parâmetros estão corretos, já avaliei muita coisa e não encontrei nada, será que conseguem me dar uma luz?!

Abaixo estou escrevendo os dois códigos, lento e rápido.

Trecho com parâmetro cravado (81):

Selecionar tudo

and (
                                            (81 = -9998 and rdnf.org_id in (81,106,107)) 
                                        or  (81 = -9999)
                                        or  (81 > 0 and 81 = rdnf.org_id)
                                      )
Trecho sem parâmetro cravado (p_org_id)

Selecionar tudo

and (
                                            (p_org_id = -9998 and rdnf.org_id in (81,106,107)) 
                                        or  (p_org_id = -9999)
                                        or  (p_org_id > 0 and p_org_id = rdnf.org_id)
                                      )
Bloco completo:

Selecionar tudo

declare

p_org_id ap.ap_invoices_all.org_id%type;

cursor c1 is

select                       rdnf.org_id
                            ,fnc_org_nome(rdnf.org_id)                          nome_org_id
                            ,rdnf.cod_dependência
                            ,apps.fnc_gl_descricao(3, rdnf.cod_dependência)     nome_dependência
                            
                            ,rdnf.cod_subdependencia
                            ,apps.fnc_gl_descricao(4, rdnf.cod_subdependencia)     nome_subdependencia
                          
                            ,rdnf.cod_conta
                            , apps.fnc_gl_descricao(5, rdnf.cod_conta)     nome_conta
                            
                            ,pgto.cod_cnpj_cpf
                            ,pgto.nom_fornecedor
                            ,pgto.dt_pagto
                            ,pgto.num_nf
                            
                            , pgto.vlr_bruto
                            
                            ,pgto.num_parcela
                            ,sum(round((pgto.vlr_previsto * perc_rateio),4))         vlr_previsto
                            ,pgto.dt_vencimento
                            ,pgto.dt_gl
                            ,pgto.num_pagto
                            ,pgto.nom_lote
                            ,sum(round((pgto.vlr_desconto * perc_rateio),4))         vlr_desconto
                            ,sum(round((pgto.vlr_juros * perc_rateio),4))            vlr_juros
                            ,sum(round((pgto.vlr_ret_contratual * perc_rateio),4))   vlr_ret_contratual
                            ,sum(round((pgto.vlr_ret_impostos_ri * perc_rateio),4))  vlr_ret_impostos_ri
                            ,sum(round((pgto.vlr_ret_impostos_ap * perc_rateio),4))  vlr_ret_impostos_ap
                            ,sum(round((pgto.vlr_pago * perc_rateio),4) )            vlr_pago_s_juros
                            ,pgto.tp_origem
                            ,pgto.tp_nota
                            ,pgto.tp_fornecedor
                            ,pgto.num_ordem
                            
                            , sum(round(round((nvl(pgto.vlr_juros,0) * perc_rateio),2) + round((pgto.vlr_pago * perc_rateio),2),2))   vlr_pago
                            
                            
                        from
                           xxce_rateio_dep_nf rdnf,    
                          ( select aiv.org_id, aiv.invoice_id,
                           
                             ( decode(assa.global_attribute9,
                                 '1', substr(assa.global_attribute10,1,3)||'.' ||substr(assa.global_attribute10,4,3)||'.'||substr(assa.global_attribute10,7,3) || '-' || assa.global_attribute12,
                                 '2', substr(assa.global_attribute10,2,2)||'.' ||substr(assa.global_attribute10,4,3)||'.'||substr(assa.global_attribute10,7,3)--|| '/' ||
                                     
                                      )) cod_cnpj_cpf,
                                      
                                      acv.vendor_name nom_fornecedor,
                                      to_char(to_date(acv.check_date, 'DD/MM/YYYY'),'DD/MM/YY') dt_pagto,
                                      aiv.invoice_num num_nf,
                                      
                                      aiv.invoice_amount vlr_bruto ,
                                      
                                      apsa.payment_num num_parcela,
                                      nvl(apsa.gross_amount,0) vlr_previsto,
                                      to_date(apsa.due_date,'DD/MM/YYYY') dt_vencimento,
                                      to_date(aipv.accounting_date,'DD/MM/YYYY') dt_gl,
                                      acv.check_number num_pagto,
                                      acv.checkrun_name nom_lote,
                                      nvl(aipv.discount_taken,0) vlr_desconto,
                                      nvl((select (nvl(iaj.invoice_amount,0)) 
                                             from ap_invoice_payments_all aipj, ap_invoices_all iaj,
                                                  ap_invoice_relationships air, ap_checks_all acj
                                            where air.original_payment_num = aipv.payment_num
                                              and air.original_invoice_id = aipv.invoice_id
                                              and air.related_invoice_id = iaj.invoice_id
                                              and iaj.org_id = aipv.org_id
                                              and iaj.invoice_id = aipj.invoice_id 
                                              and aipj.check_id = acj.check_id
                                              and acj.status_lookup_code <> 'VOIDED'
                                              and iaj.invoice_type_lookup_code = 'INTEREST'
                                     ),0) vlr_juros, 
                                     
                                     nvl(aiv.validated_tax_amount,0) vlr_ret_contratual, 
                                     
                                     nvl( ( select sum(abs(nvl(apl.amount,0))) from ap_invoice_distributions_all apl 
                                     where apl.invoice_id = aiv.invoice_id and 
                                     apl.line_type_lookup_code ='MISCELLANEOUS' and nvl(reversal_flag,'N') = 'N' ),0) vlr_ret_impostos_ri,
                                     
                                     nvl( ( select sum(abs(nvl(apl.amount,0))) from ap_invoice_distributions_all apl 
                                     where apl.awt_invoice_payment_id = aipv.invoice_payment_id and apl.line_type_lookup_code ='AWT' 
                                     and nvl(reversal_flag,'N') = 'N' ),0)  vlr_ret_impostos_ap,
                                     
                                     nvl(aipv.amount,0) vlr_pago,
                                     aiv.source tp_origem,
                                     ( select meaning
                                         from fnd_lookup_values_vl
                                        where lookup_type = 'INVOICE TYPE'
                                          and lookup_code = aiv.invoice_type_lookup_code) tp_nota,
                                          nvl(assa.global_attribute15, 'NÃO INFORMADO') tp_fornecedor,
                                              decode(assa.global_attribute15,'AUTORIDADE FISCAL',2,1) num_ordem
                               from ap.ap_invoices_all aiv,
                                    ap_invoice_payments_all aipv,
                                    ap_checks_all acv,
                                    ap_payment_schedules_all  apsa,
                                    ap_supplier_sites_all assa
                              where aiv.invoice_id = aipv.invoice_id
                                and aiv.org_id = assa.org_id
                                and aiv.vendor_id = assa.vendor_id
                                and aiv.vendor_site_id = assa.vendor_site_id
                                and aipv.check_id = acv.check_id
                                and apsa.invoice_id = aiv.invoice_id
                                and apsa.payment_num = aipv.payment_num
                                and acv.status_lookup_code <> 'VOIDED'
            
                               and acv.bank_account_name not like '%VIRTUAL%' 
                                    
                                and (
                                            (81 = -9998 and aiv.org_id in (81,106,107)) 
                                        or  (81 = -9999)
                                        or  (81 > 0 and 81 = aiv.org_id)
                                      )
                               and acv.check_date between to_date('05/02/13','DD/MM/YY') and to_date('05/02/13','DD/MM/YY')
                                
                                and aiv.invoice_id = 331392
                               
                               ) 
                               pgto
                               
                        where pgto.invoice_id = rdnf.invoice_id_ap
                          and pgto.org_id = rdnf.org_id
                          and pgto.tp_nota <> 'Juros'       
                        and (
                                            (81 = -9998 and rdnf.org_id in (81,106,107)) 
                                        or  (81 = -9999)
                                        or  (81 > 0 and 81 = rdnf.org_id)
                                      )
                           group by
                        
                             rdnf.org_id 
                            ,rdnf.cod_conta 
                            ,rdnf.cod_subdependencia
                            ,rdnf.cod_dependência
                            ,pgto.dt_pagto 
                            ,apps.fnc_gl_descricao(5, rdnf.cod_conta)                                      
                            ,pgto.cod_cnpj_cpf                                  
                            ,pgto.nom_fornecedor                                
                            ,pgto.num_nf  
                            ,pgto.num_parcela
                            ,pgto.dt_vencimento
                            ,pgto.dt_gl
                            ,pgto.num_pagto
                            ,pgto.nom_lote
                            ,pgto.tp_origem
                            ,pgto.tp_nota
                            ,pgto.tp_fornecedor
                            ,pgto.num_ordem
                            ,pgto.vlr_bruto
                            
                            order by 
                            rdnf.org_id
                           ,rdnf.cod_dependência
                          ; 

begin

p_org_id :=81;

  for c2 in c1 loop
  
      dbms_output.put_line(c2.cod_conta);
      
      dbms_output.put_line(c2.cod_dependência);
      
      dbms_output.put_line(c2.dt_pagto);
      
      dbms_output.put_line(c2.nom_fornecedor);
      
      dbms_output.put_line(c2.vlr_bruto);
      dbms_output.put_line(' ');
  end loop;
end;                          
everthon
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 14
Registrado em: Qua, 18 Jan 2012 2:43 pm
att,

Everthon Souza
Em Deus, posso todas as coisas!

Bom, só pra constar, resolvi o problema.
De fato tinha ligação com o plano de execução, eu fazia um FULL Scan em outro momento da minha procedure, igualei os tipos de dados dos meus joins que dei mole e deixei passar desapercebido.

A execução da procedure passou de 2 min e meio para menos de 10 segundos.

Vivendo e aprendendo.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 11 visitantes