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


Responder a