Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

fnunez33

Desempenho do relatório

Recommended Posts

Bom dia,

 

Tenho esse relatório que traz as informações corretamente, porém demora muito para trazer a informação seja de um dia ou mais, poderiam me ajudar a melhorar o desempenho?

 

Segue relatório:

 

 

select   db_edip_empresa,  

         db_edip_repres,
         db_cli_codigo,
         db_cli_nome,
         db_edip_lpreco,      
         db_edip_nro,
         db_edii_pedmerc,       
         db_edip_dt_emissao,  
         db_prod_codigo,
         db_prod_descricao,    
         db_edii_preco_bru, 
         db_edii_perc_dcto,    
         db_edii_preco_liq, 
         db_edii_preco_merc, 
         round(100-(db_itnv_preco/db_edii_preco_merc*100),2),
         decode(db_itnv_preco,0,' 0,00 - RESTRIÇÃO', replace(db_itnv_preco,'.',',')),
         db_itnv_preco - db_edii_preco_liq as difer,
         db_edii_qtde_vda,
         db_edii_qtde_vda * db_itnv_preco
   from db_edi_pedprod, db_edi_pedido, db_produto, db_cliente, db_cliente_edi, db_itens_nvenda, db_tb_empresa
   where db_edip_comprador = db_edii_comprador
     and db_edii_nro = db_edip_nro
     and db_prod_cod_barra = db_edii_produto
     and db_cli_codigo = db_clied_codigo
     and db_edip_cliente = db_clied_ean 
     and db_itnv_produto = db_prod_codigo
     and DB_ITNV_NROPED = DB_EDII_PEDMERC
and db_edip_empresa = DB_TBEMP_CODIGO
and DB_ITNV_EMPRESA = db_edip_empresa
     and not exists(select 1 from db_pedido_prod, db_produto
                     where db_pedi_pedido = db_edii_pedmerc
                       and db_pedi_produto = db_prod_codigo
                       and db_prod_cod_barra = db_edii_produto)
union 
select   db_edip_empresa, 
         db_edip_repres,
         db_cli_codigo,
         db_cli_nome,
         db_edip_lpreco, 
         db_edip_nro,
         db_edii_pedmerc,
         db_edip_dt_emissao, 
         db_prod_codigo,
         db_prod_descricao,
         db_edii_preco_bru, 
         db_edii_perc_dcto,
         db_edii_preco_liq, 
         db_edii_preco_merc,
         round(100-(db_itnv_preco/db_edii_preco_merc*100),2),
         decode(db_itnv_preco,0,' 0,00 - RESTRIÇÃO', replace(db_itnv_preco,'.',',')),
         db_itnv_preco - db_edii_preco_liq as difer,
         db_edii_qtde_vda,
         db_edii_qtde_vda * db_itnv_preco
   from db_edi_pedprod, db_edi_pedido, db_produto, db_cliente, db_cliente_edi, db_itens_nvenda, db_tb_empresa
   where db_edip_comprador = db_edii_comprador
     and db_edii_nro = db_edip_nro
     and db_prod_cod_barra = db_edii_produto
     and db_cli_codigo = db_clied_codigo
     and db_edip_cliente = db_clied_ean 
  and DB_ITNV_REPRES   = DB_EDIP_REPRES
  and DB_ITNV_PRODUTO  In (select db_prod_codigo from db_produto p2 where p2.db_prod_cod_barra = DB_EDII_PRODUTO and rownum = 1)
  and DB_ITNV_DATA     = DB_EDIP_DT_EMISSAO 
  and db_edip_empresa = DB_TBEMP_CODIGO 
  and DB_ITNV_EMPRESA  = DB_EDIP_EMPRESA
  and not exists (select 1 from db_edi_pedido ediped2 where ediped2.db_edip_nro = to_char(DB_ITNV_NROPED))
     and not exists(select 1 from db_pedido_prod, db_produto 
                     where db_pedi_pedido = db_edii_pedmerc
                       and db_pedi_produto= db_prod_codigo
and db_prod_cod_barra = db_edii_produto) 
    

Compartilhar este post


Link para o post
Compartilhar em outros sites

As estatísticas de Banco estão atualizadas ?

As tabelas tem índices

Fez o Plano de execução da query

__Fez o plano de execução (simulando uma passagem de dado) das subqueries ?

Não tem nenhuma condição que possa filtrar os registros ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Repito ...

 

As estatísticas de Banco estão atualizadas ?

As tabelas tem índices ?

Fez o Plano de execução da query ?

__Fez o plano de execução (simulando uma passagem de dado) das subqueries ?

Não tem nenhuma condição que possa filtrar os registros ?

 

 

:)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá cara, além de seguir as dicas do Motta,

 

Veja sua query ... as duas querys são idênticas, só muda a clausula WHERE, dá pra usar um OR ali né

 

Só retirando o UNION e o segundo SELECT, devo ter reduzido sua query pra metade do tempo ... e olha que tem MUITA where Igual, é só colocar pra dos parenteses e brincar com as portas lógicas ...

 

select   db_edip_empresa,  
         db_edip_repres,
         db_cli_codigo,
         db_cli_nome,
         db_edip_lpreco,      
         db_edip_nro,
         db_edii_pedmerc,       
         db_edip_dt_emissao,  
         db_prod_codigo,
         db_prod_descricao,    
         db_edii_preco_bru, 
         db_edii_perc_dcto,    
         db_edii_preco_liq, 
         db_edii_preco_merc, 
         round(100-(db_itnv_preco/db_edii_preco_merc*100),2),
         decode(db_itnv_preco,0,' 0,00 - RESTRIÇÃO', replace(db_itnv_preco,'.',',')),
         db_itnv_preco - db_edii_preco_liq as difer,
         db_edii_qtde_vda,
         db_edii_qtde_vda * db_itnv_preco
   from db_edi_pedprod, db_edi_pedido, db_produto, db_cliente, db_cliente_edi, db_itens_nvenda, db_tb_empresa
   where (	db_edip_comprador = db_edii_comprador
			and db_edii_nro = db_edip_nro
			and db_prod_cod_barra = db_edii_produto
			and db_cli_codigo = db_clied_codigo
			and db_edip_cliente = db_clied_ean 
			and db_itnv_produto = db_prod_codigo
			and DB_ITNV_NROPED = DB_EDII_PEDMERC
			and db_edip_empresa = DB_TBEMP_CODIGO
			and DB_ITNV_EMPRESA = db_edip_empresa
			and not exists(select 1 from db_pedido_prod, db_produto
                     where db_pedi_pedido = db_edii_pedmerc
                       and db_pedi_produto = db_prod_codigo
                       and db_prod_cod_barra = db_edii_produto)
		) OR
		(	db_edip_comprador = db_edii_comprador
			and db_edii_nro = db_edip_nro
			and db_prod_cod_barra = db_edii_produto
			and db_cli_codigo = db_clied_codigo
			and db_edip_cliente = db_clied_ean 
			and DB_ITNV_REPRES   = DB_EDIP_REPRES
			and DB_ITNV_PRODUTO  In (select db_prod_codigo from db_produto p2 where p2.db_prod_cod_barra = DB_EDII_PRODUTO and rownum = 1)
			and DB_ITNV_DATA     = DB_EDIP_DT_EMISSAO 
			and db_edip_empresa = DB_TBEMP_CODIGO 
			and DB_ITNV_EMPRESA  = DB_EDIP_EMPRESA
			and not exists (select 1 from db_edi_pedido ediped2 where ediped2.db_edip_nro = to_char(DB_ITNV_NROPED))
			and not exists(select 1 from db_pedido_prod, db_produto 
                     where db_pedi_pedido = db_edii_pedmerc
                       and db_pedi_produto= db_prod_codigo
			and db_prod_cod_barra = db_edii_produto) 
		);
    

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alm disto dito acima ...

 

Algumas tabelas do where da query principal estão na subqueries com not exists, existe algum motivo para isto !?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.