Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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)Boa Tarde,
Eu coloquei na data de emissão somente um dia e também demorou o mesmo?
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 ?
:)
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)
);Alm disto dito acima ...
Algumas tabelas do where da query principal estão na subqueries com not exists, existe algum motivo para isto !?
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 ?