Chiappa, O item do EXISTS ser melhor ou pior do que o IN não é mito! Existe uma regra para usar um ou outro (que em alguns casos pode melhorar o plano de execução), que está documentada no Oracle Performance Tuning Guide, veja: http://docs.oracle.com/cd/B19306_01/server.102/b14211/sql_1016.htm
Elcio, Algumas dicas gerais, para melhorar performance, evite o uso de OR, comparações com NULL e funções nas instruções SQL. Se não for possível evitá-las existem algumas formas de contornar a má performance que isso tudo iria gerar, mas tudo isso não é muito simples e exige muitos conhecimentos prévios que não dá para explicar aqui (eu ensino em treinamentos SQL Tuning). []s Fábio Prado http://www.fabioprado.net Em 23 de julho de 2013 15:40, J. Laurindo Chiappa <jlchia...@yahoo.com.br>escreveu: > ** > > > Bom, primeiro eu ** TENHO ** que dizer que alguém que diz, point-blank e > generalizando, que "X deixa lento", SEM dizer o porque, SEm > testes/provas/caso repetível, para mim está usando regras de dedão for a de > contexto, está é ESPALHANDO MITOS, falando abobrinha, okdoc ?? É algo > semelhante aos tantos outros mitos de performance, tipo "EXISTS é > melhor/pior que IN" - afirmações extraordinárias exigem provas > extraordinárias.... Pra mim afirmação sem prova é a indicação CLARA que o > sujeito é um "dba", entre aspas e minúsculas totais.... > > Isso posto, a sua resposta - se por qquer motivo vc não quiser usar o > NULL, sem analisar muito, eu ACHO que com : > > > and (loj.fim_atividade is null or gar.dt_vencimento < loj.fim_atividade) > > vc quer que se loj.fim_atividade for null NADA SEJA COMPARADO (o mesmo > efeito que vc fazer uma comparação sempre verdadeira), e que quando > loj.fim_atividade NÃO for null aí sim a comparação deve ser feita com > gar.dt_vencimento < loj.fim_atividade .... Sabendo (como já comentado em > outra thread recentemente) que uma das possibilidades ao se lidar com NULL > é o NVL, poderíamos usar : > > and gar.dt_vencimento < nvl(loj.fim_atividade, to_date('31/12/9999', > 'dd/mm/yyyy') ) > > > ok ? A linha acima é praticamente a "tradução" do que eu disse em > português : SE fim_atividade for null o valor retornado pelo NVL é um valor > que necessariamente é maior que dt_vencimento, portanto sempre sendo > verdadeira, E SE fim_atividade for não-nulo, aí a comparação é > dt_vencimento < loj.fim_atividade , como desejado, acho eu.... > > []s > > Chiappa > > --- Em oracle_br@yahoogrupos.com.br, Elcio Francisco <elciofrancisco@...> > escreveu > > > > > Pessoal, os dba´s sempre fala que no filtro quando tem a clausula OR > deixa lento. Nesse caso testo se data dt_confirmacao_documento for null ele > busca pela data gar.dt_vencimento > > como fazer isso sem usar o OR > > > > Muito obrigado > > > > select count(distinct mov.numero_venda) > qtd > > ,sum(gar.saldo_devedor) > total_saldo > > ,loj.unidade_servico > > from crd.empresa loj > > ,crd.cliente cli > > ,crd.vendas gar > > ,crd.pedido mov > > > where loj.regional LIKE > DECODE(p_regional, '0', '%','%' || p_regional || '%') > > and loj.filial LIKE > DECODE(p_filial, '0', '%','%' || p_filial || '%') > > and loj.escritorio = p_escritorio > > > and loj.grupo = p_cliente > > and loj.regional <> 'T0' > > and loj.filial <> 'T0' > > and loj.identificacao = '1' > > and loj.empresa = > cli.empresa_origem > > and cli.cliente = gar.cliente > > and cli.empresa = gar.empresa > > and gar.flg_garantia = 'P' > > and (((dt_confirmacao_documento > is not null) and trunc(dt_confirmacao_documento) >= p_primeiro_dia) or > > ((dt_confirmacao_documento is > null) and trunc(gar.dt_vencimento) >= p_primeiro_dia)) > > and (((dt_confirmacao_documento > is not null) and trunc(dt_confirmacao_documento) <= p_ultimo_dia) or > > ((dt_confirmacao_documento is > null) and trunc(gar.dt_vencimento) <= p_ultimo_dia)) > > > and gar.numero_venda = > mov.numero_venda > > and mov.operacao = '01' > > and mov.produto LIKE > DECODE(p_produto, '0', '%','%' || p_produto || '%') > > and mov.loja_empresa = loj.empresa > > and mov.loja_central = loj.central > > and mov.loja_loja = loj.loja > > --and (loj.fim_atividade is null > or gar.dt_vencimento < loj.fim_atividade) > > group by loj.unidade_servico > > > order by loj.unidade_servico > > > > Elcio Francisco > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > -- Fábio Prado www.fabioprado.net "Compartilhando conhecimentos e treinando profissionais em Bancos de Dados Oracle" [As partes desta mensagem que não continham texto foram removidas] ------------------------------------ -------------------------------------------------------------------------------------------------------------------------- >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira >responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -------------------------------------------------------------------------------------------------------------------------- >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » >Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: >http://www.oraclebr.com.br/ ------------------------------------------------------------------------------------------------------------------------ Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/oracle_br/ <*> Para sair deste grupo, envie um e-mail para: oracle_br-unsubscr...@yahoogrupos.com.br <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html