O mito, como eu disse, é a GENERALIZAÇÂO : afirmar que x é melhor que y SEM indicar especifidades, sem ter uma análise/prova, SEM se levar em conta que há ocasiões/situações em que x pode ser pior MAS há também situações em que x pode ser MUITO MELHOR, é sim folclore de DBAs : diversos especialistas Reconhecidos (http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:953229842074#1525158235153 é um exemplo) já fizeram a prova de que Há situações em que EXISTS pode ser nelhor mas há também situações em que ele pode ser pior.... O MITO, repito, é afirmar point-blank algo, SEM prova/referência/demonstração... Isso vale também para o caso do colega : DE FORMA ALGUMA se pode afirmar que SEMPRE o OR causa piora ou melhora na performance, quem manda uma firmação dessa generalizada E sem demonstração/restrição sorry, mas só pode estar espalhando uma historinha que ouviu , algo que ele ACHA que é assim, uma regrinha geral que ele não sabe como/se/aonde funciona ou se funciona, , ou seja, um mito...
[]s Chiappa --- Em oracle_br@yahoogrupos.com.br, Fabio Prado <fbifabio@...> escreveu > > 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 > <jlchiappa@...>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] >