RE: [oracle_br] Re: Performance IS NULL

2009-11-26 Por tôpico Teixeira, Gabriel
Muito interessante as dicas!! 
 
Obrigado!



From: oracle_br@yahoogrupos.com.br [mailto:oracle...@yahoogrupos.com.br] On 
Behalf Of jlchiappa
Sent: quinta-feira, 26 de novembro de 2009 18:16
To: oracle_br@yahoogrupos.com.br
Subject: [oracle_br] Re: Performance IS NULL


  

Bem, na verdade não sei se pode se chamar de gambiarra, já que o fato do índice 
b*tree no bd Oracle não indexar valores nulos é padrão, é uma característica 
técnica documentada e sempre presente, não é nem de longe bug que precise de 
work-around nem nada assim... Bom, quanto ao problema em questão, acho que 
antes de sair indexando a pessoa TEM que :

1. saber a cardinalidade,ie, QUANTOS registros tem esse cara nulo e quantos não

e

2. extrair o plano de execução real 9e estatísticas de execução, I/Os, tempos, 
etc) dos SQLs com e sem o and coluna is null

Digo isso porque (já que o colega lá optou por Não nos dar a query nem a 
estrutura) de repente pode ser que já haja um índice excelente, e talvez a 
query estava sendo satisfeita só com acesso ao índice, MAS com a adição da 
coluna a mais (que o otimizador ** sabe ** que jamais vai estar no índice por 
ser nula) passou a ser necessária uma visita aos blocos da tabela, o que antes 
não aconteciaNum caso desses, Pode Ser que o novo índice de função seja 
menos eficiente que o índice ideal que já tínhamos antes... E Mais, tanto Pode 
Ser que os nulls sejam poucos (aí realmente valeria a pena indexar quem é 
nulo), Quanto pode ser que os nulls sejam muitos muitos, aí talvez valha mais a 
pena indexar quem NÃO é nulo (via índice de função que retorna valor só pros 
não nulos), ou até optar por um table scan ... vareia, ok ? Só o colega que 
formulou a pergunta tem os dados TODOS na mão, é mais ou menos como eu falei na 
minha apresentação de CBO - a pessoa TEM que conhecer os dados dela, o ambiente 
dela, pra só aí poder usar o Otimizador na eficiência máxima...

[]s

Chiappa

--- Em oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> , 
Rosivaldo Ramalho  escreveu
>
> Em geral se cria um índice baseado em função (usando nvl), e no select
> se utilza a função que você utilizou no índice (where nvl(coluna)..).
> 
> Se você já tem um índice na coluna, você pode atualizar os valores
> nulos para um valor que esteja fora da regra do teu negócio, algo no
> ano de 1800/1700, dá um rebuild no índice e pode continuar com o
> select normal, só passando agora essa nova data no lugar do IS NULL.
> 
> Essas duas formas são meio que gambiarras, mas eu desconheço outras.
> 
> 2009/11/26 francisco porfirio :
> > Boa Tarde Pessoal.
> >
> > Tenho uma consulta que está demorando devido a utilização do IS NULL.(Segue
> > parte da consulta)
> >
> > ...
> > and campo_timestamp is null
> > ...
> > Sei que quando isso é feito não adianta criar um índice para o campo
> > testado.
> > Alguem sabe uma outra forma de capturar os campos que são nulos sem perder
> > tanto a performance?
> >
> >
> > Versão do Oracle: 10.2.0.4.0
> > --
> > Atenciosamente
> > Francisco Porfirio Ribeiro Neto
> >
> >
> > [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/ 
> > <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/ <http://www.oraclebr.com.br/> 
> > -- Links do Yahoo! 
> > Grupos
> >
> >
> >
> 
> 
> 
> -- 
> Rosivaldo Azevedo Ramalho
> Consultor Oracle Database / Application Server
> mail/msn: rosiva...@...
> mobile: +55 83 8893 8281
> Oracle Database 10g Certified Professional
> Oracle Application Server 10g Certified Professional
>






[As partes desta mensagem que não continham texto foram removidas]



[oracle_br] Re: Performance IS NULL

2009-11-26 Por tôpico jlchiappa
Bem, na verdade não sei se pode se chamar de gambiarra, já que o fato do índice 
b*tree no bd Oracle não indexar valores nulos é padrão, é uma característica 
técnica documentada e sempre presente, não é nem de longe bug que precise de 
work-around nem nada assim... Bom, quanto ao problema em questão, acho que 
antes de sair indexando a pessoa TEM que :

1. saber a cardinalidade,ie, QUANTOS registros tem esse cara nulo e quantos não

e

2. extrair o plano de execução real 9e estatísticas de execução, I/Os, tempos, 
etc) dos SQLs com e sem o and coluna is null

Digo isso porque (já que o colega lá optou por Não nos dar a query nem a 
estrutura) de repente pode ser que já haja um índice excelente, e talvez a 
query estava sendo satisfeita só com acesso ao índice, MAS com a adição da 
coluna a mais (que o otimizador ** sabe ** que jamais vai estar no índice por 
ser nula) passou a ser necessária uma visita aos blocos da tabela, o que antes 
não aconteciaNum caso desses, Pode Ser que o novo índice de função seja 
menos eficiente que o índice ideal que já tínhamos antes...  E Mais, tanto Pode 
Ser que os nulls sejam poucos (aí realmente valeria a pena indexar quem é 
nulo), Quanto pode ser que os nulls sejam muitos muitos, aí talvez valha mais a 
pena indexar quem NÃO é nulo (via índice de função que retorna valor só pros 
não nulos), ou até optar por um table scan ... vareia, ok ? Só o colega que 
formulou a pergunta tem os dados TODOS na mão, é mais ou menos como eu falei na 
minha apresentação de CBO - a pessoa TEM que conhecer os dados dela, o ambiente 
dela, pra só aí poder usar o Otimizador na eficiência máxima...

 []s

  Chiappa

--- Em oracle_br@yahoogrupos.com.br, Rosivaldo Ramalho  escreveu
>
> Em geral se cria um índice baseado em função (usando nvl), e no select
> se utilza a função que você utilizou no índice (where nvl(coluna)..).
> 
> Se você já tem um índice na coluna, você pode atualizar os valores
> nulos para um valor que esteja fora da regra do teu negócio, algo no
> ano de 1800/1700, dá um rebuild no índice e pode continuar com o
> select normal, só passando agora essa nova data no lugar do IS NULL.
> 
> Essas duas formas são meio que gambiarras, mas eu desconheço outras.
> 
> 2009/11/26 francisco porfirio :
> > Boa Tarde Pessoal.
> >
> > Tenho uma consulta que está demorando devido a utilização do IS NULL.(Segue
> > parte da consulta)
> >
> > ...
> > and campo_timestamp is null
> > ...
> > Sei que quando isso é feito não adianta criar um índice para o campo
> > testado.
> > Alguem sabe uma outra forma de capturar os campos que são nulos sem perder
> > tanto a performance?
> >
> >
> > Versão do Oracle: 10.2.0.4.0
> > --
> > Atenciosamente
> > Francisco Porfirio Ribeiro Neto
> >
> >
> > [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
> >
> >
> >
> 
> 
> 
> -- 
> Rosivaldo Azevedo Ramalho
> Consultor Oracle Database / Application Server
> mail/msn: rosiva...@...
> mobile: +55 83 8893 8281
> Oracle Database 10g Certified Professional
> Oracle Application Server 10g Certified Professional
>