fnunez33 0 Denunciar post Postado Novembro 14, 2013 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
Motta 645 Denunciar post Postado Novembro 14, 2013 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
fnunez33 0 Denunciar post Postado Novembro 14, 2013 Boa Tarde, Eu coloquei na data de emissão somente um dia e também demorou o mesmo? Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Novembro 14, 2013 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
fabiogalera 0 Denunciar post Postado Novembro 14, 2013 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
Motta 645 Denunciar post Postado Novembro 14, 2013 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