Perfeito Chiappa! Agora concordo com você! Tem muita coisa em Tuning que não tem regra absoluta. Os casos tem que ser analisados e testados. Eu mostro nos meus treinamentos de SQL Tuning que em certas situações utilizar o CASE para evitar múltiplas instruções com UNION ALL melhora a performance. Em outras eu faço o contrário e consigo melhorar também a performance, mudando um pouco o jeito de escrever a instrução SQL. Mostro várias situações parecidas com essa, através de teoria e prática!
Existem muitas variantes que influenciam na performance, portanto, aviso ao pessoal que está iniciando estudos em tuning: *Não há RECEITA DE BOLO que serve para OTIMIZAR qq instrução SQL e nem para otimizar qualquer instância de BD*! Há muita coisa a ser estudada para entender quando e como fazer! []s Fábio Prado http://www.fabioprado.net Em 23 de julho de 2013 16:44, J. Laurindo Chiappa <jlchia...@yahoo.com.br>escreveu: > ** > > > 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] > > > > > -- 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