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


Responder a