Blz ?? Sorry pelo atraso (resposta tão em delay absolutamente não está de 
acordo com a netiqueta, Ou vc responde logo Ou não se responde), mas vou 
colocar alguns coments em cima...
 Antes de mais nada, acho que é Importantíssimo a gente explicitar o que é o 
Histograma, dentro aqui do nosso mundinho Oracle : ele é uma LISTA de valores, 
registrando para uma determinada coluna numa determinada tabela, Quais são os 
seus valores possíveis e Quantos registros/linhas existem para cada valor 
possível nessa coluna dentro da Tabela, é isso.... A idéia é que, quando um SQL 
usar uma condição de filtro/join/o que for comparando uma coluna com um valor 
(ou mesmo com o valor de outra coluna), o CBO saiba mais ou menos quantas 
linhas ele vai ter que processar/ler/ordenar para esse valor X comparado com a 
coluna.
  Só essa simples introdução ao conceito já tira um monte de dúvidas : por 
exemplo, uma coluna que é PK - por definição qquer acesso a um valor qquer 
nessa coluna SEMPRE retorna uma e só uma linha, é a Definição de PK - tá mais 
que óbvio pelo Conceito que não faz sentido ter Histogramas aí, a função do 
Histograma é saber quantas linhas um valor X retorna... Outra, digamos que vc 
tenha colunas que só são usadas para retornar dados na linha do SELECT (não 
participam de JOIN, de oRdenação, de WHERE (filtragem), nem nada assim - será 
que é útil ter Histograma nesse caso ? è meio óbvia a resposta NEGATIVA, Em 
Cima do Conceito.... Esse é o Primeiro ponto a considerar, o Histograma é 
útil/aplicável para a coluna/tabela em análise ?????

  Outro ponto Crucial quando se discute Histogramas, também derivado do 
Conceito : é Ululantemente Óbvio que a Utilidade de vc saber quantas linhas 
existem para cada valor possível é vc poder Responder aos casos de Distribuição 
Irregular, ie, onde algum/alguns valor(es) estão presentes em Muito Mais ou 
muito menos linhas... O exemplo classico - digamos que vc numa tabela (de 
funcionários, talvez) vc tem um campo SEXO que pode ser M ou F : via de regra 
vc esperaria ter mais ou menos metade de homens e metade de mulheres, então se 
um SQL consultar registros com SEXO='M' ou se consultar SEXO='F' ele mais ou 
menos vai ter que acessar/ler metade da tabela em qquer caso, né ? Então o 
palpite padrão do CBO (ie, que X valores distintos retornam [total / x] linhas) 
funcionaria joinha - no nosso exemplo, se a tabela tiver 500 linhas, seja a 
pesquisa por M seja por F vai retornar algo próximo de 500 / 2 = 250 linhas.... 
Veja que estamos falando ESTATISTICAMENTE, interessa que é algo próximo - se na 
realidade são 300 M e 200 F não faz mal, ainda tá Estatisticamente próximo.... 
PORÉM, nem sempre essas regrinhas simples valem : com essa mesma tabela, nesse 
mesmo campo SEXO, suponha que na verdade ela representa Fichas de pacientes num 
hospital que trate câncer de mama - o CBO não sabe ** mas ** nesse cenário a 
realidade vc vai ter muuuuuitos mais registros com F do que com M devido á 
raridade que é cancer de mama em homens, aí as regrinhas furam COMPLETAMENTE, 
aí SIM é hora total de se usar HISTOGRAMAS para indicar pro CBO que há uma 
diferença Vital entre as qtdades de linhas retornadas por cada valor 
possível.... yep ??
====> ESTE é o Segundo ponto Crucial para te apoiar na decisão de usar ou não 
Histogramas , vc CONHECE a distribuição de valores ?? Ela É altamente irregular 
, ou não ??? Só e apenas VOCÊ, que conhece os dados que são SEUS, que conhece o 
SEU AMBIENTE, é que pode responder isso.... Blz ?? Vc até pode, se não tiver a 
informação, usar as rotinas/opções de AUTO para os histogramas, ou fazer 
consultas manualmente, para tentar levantar a informação, MAS a confirmação / 
avaliação da Qualidade dos histogramas e/ou das regrinhas automáticas do CBO É 
POR SUA CONTA, totalmente...

  Mas não acabou ainda : outra questão a considerar é que vc Nem Sempre usa 
valores nos SQLs (tipo WHERE SEXO='M') , há ocasiões (principalmente em OLTP) 
aonde vc usa BIND VALUES (ie, algo tipo SEXO = :X , onde X é uma variável) .... 
Isso é complexo de otimizar porque a cada execução X pode ter valores 
diferentes e em o SQL sendo o mesmo (só mudou o valor da variável, mas o texto 
do SQL não) o SQL executado anteriormente está em cache e nós queremos o 
re-utilizar, mas sem que tenhamos que o re-otimizar, o que é Custoso -  então o 
que fazer ?? 
    Até a versão 10g o RDBMS fazia BIND PEEKING, ie : antes do SQL ir pro cache 
o CBO guardava em memória e analisava o valor das variáveis BIND, usando 
histogramas e tudo que tinha direito, e é essa otimização que é imposta ao SQL 
sendo cacheado.... O problema é quando a primeira execução/otimização do SQL 
era com as binds tendo um valor "ruim"/atípico - digamos, alguém roda um SQL 
numa condição SEXO = :X tendo o valor 'F' para a variável X, aí (CORRETAMENTE, 
dado o grande número de linhas a se processar/ler) o CBO otimiza o SQL com um 
FULL TABLE SCAN, aí o coitado que imediatamente depois rodar o mesmo SQL mas 
com 'H' na variável recebe o mesmo plano de full table scan que está no cache, 
o que Não É o ótimo pra ele.... A solução para esse cenário no 10g pode ser não 
bindar, pode ser gerar um SQL ligeiramente diferente (para que ocorra nova 
otimização) a cada mudança da variável, ou mesmo DESLIGAR o BIND PEEK...
   NO 11g a Oracle deu um pouco mais de inteligência para o uso de binds, 
passando a fazer diferente : a cada otimização de um SQL, se havia histogramas 
e se um valor de histograma foi usado para a Otimização, esse SQL (esse cursor, 
na verdade) fica "marcado" internamente como 'sensível a binding', então as 
próximas execuções dele vão passar a levar em conta o histograma e se preciso 
criam um child cursor com um plano diferente para o novo valor da variável, e é 
esse child que é usado e cacheado.... Isso minimiza a chance de planos errados 
MAS pode levar à criação de múltiplos planos (e múltiplas entradas no cache de 
SQL, que é um overhead) , entre outras questões....
   
   ==> Então ESTE é o Terceiro ponto sobre usar ou não histogramas, a pessoa 
TEM que saber como estão sendo usados os histogramas, se pode haver efeitos 
relacionados com peeking se ela usa bindings.....
   
   E finalmente, a questão de QUANTIDADES de valores e amostragem : não é 
fisicamente possível/viável vc coletar listas de centenas e centenas de valores 
distintos possíveis para uma coluna (não há poder computacional Nem janela 
hábil pra isso, via de regra), Nem é viável vc ler/ordenar/processar 
não-sei-quantosGBs para as tabelas grandes... O IDEAL seria que vc coletasse 
TODAs as possibilidades de valores distintos lendo/processando a tabela inteira 
sempre, mas em muitos casos isso não é possível, assim :

   - o Oracle coloca um LIMITE na qtdade de valores distintos para uma coluna 
(o bucket size) de 254

   - para as tabelas maiores vc (por questões computacionais/de tempo) precisa 
dar uma Porcentagem a ler/processar, não dá para o fazer com 100%

  ==> Este é o Quarto ponto sobre histogramas : já que nem sempre vc pode fazer 
a coleta Integral dos histogramas, vc TEM que encontrar um ponto razoável para 
vc.... Até pode se começar com as opções de AUTO, mas SE a sua análise da 
qualidade/efetividade dos histogramas resultar negativa, vc TEM que testar e 
encontrar tanto bucket sizes quanto porcentual de estimate que te atendam... 
  
    []s
        
          Chiappa
          

--- Em oracle_br@yahoogrupos.com.br, Régis  Pradela <pradelarf@...> escreveu
>
> Senhores, bom dia!
> 
> O intuito desta mensagem não é tirar dúvida, mas sim abrir uma discussão
> para que possamos "trocar figurinhas" sobre casos de estudo, trabalhos,
> testes, etc, envolvendo diferentes tipos de coletas de estatísticas e seu
> reflexo na perfomance do ambiente.
> A um bom tempo estou estudando as mudanças de performance que o tipo de
> coleta de estatísticas causa nos ambientes, porem ainda não consegui chegar
> a uma resposta certa.
> Na verdade estou achando que a resposta correta seria "Varia de ambiente
> para ambiente, alguns ambientes o histograma melhora, e muito, e em outros
> ambiente fica muito pior. Temos que testar e homologar a coleta de
> Estatísticas para cada ambiente."
> Segue alguns dados que levantei:
> ==> Caso 1
> Ambiente Linux 64bit Oracle 10gr2 10.2.0.3.
> Com a coleta de estatísticas com histogramas tivemos diversas melhorias na
> performance do ambiente.
> Após a migração deste ambiente para Oracle 11gr2 (11.2.0.3) algum processos
> ficaram mais rápidos, porem alguns ficaram muito mais lentos.
> Após remover os histogramas os processos passaram a executar com muita
> rapidez, processos de fechamento que executavam em 26 horas passaram a
> executar em 4horas.
> Alguns processos de fechamento do financeiro que demoravam em torno de 30
> minutos para executar, passaram a executar em 4 minutos.
> Processos que faziam import de arquivos externos, que demoram, em média 40
> minutos para importar um arquivo de 100MB passaram a executar em menos de um
> minuto.
> 
> Resultado => No Oracle 10gr2 o histograma melhorou o ambiente, porem após
> migrar para o 11gr2 a melhor opção foi não utilizar histogramar.
> Neste caso não tivemos migração de hardware, apenas de software.
> 
> ==> Caso 2
> Ambiente AIX 6 com Oracle 11gr2 11.2.0.3 Extended RAC
> As coletas de estatísticas com histograma foram implementadas no ambiente e
> geraram diversas melhoras de performance.
> Recentemente após particionar as maiores tabelas da folha de pagamento os
> fechamentos que demoravam em torno de 2 horas, passaram a demorar 9 horas.
> Alguns fechamentos que demoravam em torno de 20 minutos por período passou a
> demorar mais de 4 horas.
> Observando o ambiente notamos que após o particionamento não foi coletado os
> histogramas das tabelas, após a coleta novamente os processos voltaram a
> executar rapidamente.
> 
> Resultado=> Neste caso os histogramas fizeram uma grande diferença positiva
> no ambiente.
> 
> Nos ultimas eventos da Oracle que tive oportunidade de participar a
> recomendação dos palestrantes está sendo , "Use a coleta default, se ela não
> te atender, então pense em muda-la".
> Ultimamente estou acreditando que, como dito acima, depende muito do
> ambiente, distrubuição de dados, aplicação, enfim, temos que homologar a
> melhor coleta de estatísticas para cada ambiente.
> 
> Agora gostaria de saber de vocês, sobre experiências e se vocês já tem
> alguma ideia formada sobre este assunto.
> Não coloquei muitas evidencias e/ou testes, apenas falei pois a idéia seria
> mais um bate papo sobre o "feeling"  de cada um sobre este assunto.
> 
> -- 
> R.P.
> DBA Oracle
> Blog: www.rpradela.com.br
> 
> Oracle Database 11g Administrator Certified Professional
> Oracle Database 11g Administrator Certified Associate
> Oracle Database 10g Real Applications Clusters Administrator Certified
> Expert (OCE)
> Oracle Enterprise Linux Certified Implementation Specialist (OCE)
> Oracle Database 11g Data Warehousing Certified Implementation Specialist
> Oracle Exadata 11g Certified Implementation Specialist
> 
> 
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>


Responder a