Pergunta

Na pergunta anterior eu tenho comentário sobre estatísticas do Oracle:

A Oracle não sabe que 50M é maior do que o número de linhas. Claro, ele tem estatísticas, mas eles poderiam ser velho e errado - e Oracle nunca iria permitir-se para entregar um resultado incorreto só porque as estatísticas são erradas

Eu tinha certeza que a Oracle se baseia em estatísticas quando se prepara consulta plano de execução. Antes da versão 10 foi recomendado para atualizar estatísticas de tempos em tempos e de dados Oracle 10g estatísticas recolhe automaticamente.

Alguém pode explicar o quanto analisador de consulta do Oracle se baseia em dados estatísticos?

Foi útil?

Solução

A Oracle usa estatísticas muito, para gerar consulta execução planos . O que não faz (e não deve) fazer é usar essas estatísticas de uma maneira que irá afectar consulta Resultados , que é o que você estava tentando fazer com "ROWNUM <50000000". As estatísticas podem estar desatualizados, ou em falta. No entanto, isso só significa que a Oracle pode ser lento para gerar o resultado correto, isso não significa que a Oracle irá retornar um resultado incorreto.

Se a Oracle trabalhou como você esperava, então ele pode decidir que "ROWNUM <50000000" significava "obter todas as linhas" mesmo que a tabela agora continha 60.000.000 linhas (mas teve de estatísticas de data dizendo que continha apenas 49 milhões). Felizmente, ele não funciona.

Outras dicas

As estatísticas são muito importantes para o otimizador de consulta. Eles devem ser reunidos em uma base regular automaticamente ou manualmente.

Ao executar uma consulta a Oracle irá produzir um conjunto de planos de execução disponíveis, a fim de satisfazer a sua consulta. Esses planos de execução são os mesmos do ponto de vista de que eles vão voltar-lhe o mesmo resultado exato, é apenas o caminho para chegar lá pode ser muito mais eficiente para um plano em detrimento de outro. Para determinar esta eficiência, a Oracle usa as estatísticas geradas sobre os objetos utilizados em cada um dos planos de execução para determinar seus custos individuais. Se essas estatísticas são inexistentes ou são obsoletos, o custo associado a cada plano será menos precisa e, portanto, o plano ideal não pode ser escolhido.

Aqui estão algumas das principais estatísticas que utiliza o Oracle para determinar este custo:

A Estatística da tabela

 * Number of rows
 * Number of blocks
 * Average row length    

estatísticas de coluna

 * Number of distinct values (NDV) in column
 * Number of nulls in column
 * Data distribution (histogram)
 * Extended statistics

estatísticas de índice

* Number of leaf blocks
* Levels
* Clustering factor

Estatísticas do Sistema

* I/O performance and utilization
* CPU performance and utilization

As estatísticas são usadas pelo otimizador baseado em custo Oracle (CBO) para calcular os custos relativos de diferentes formas de executar uma consulta de modo que o mais adequado pode ser escolhido.

Em toda a este funciona muito bem, e está sendo continuamente melhorado. Por exemplo, em 11g você pode reunir várias colunas histogramas que ajuda muito com consultas tendo predicados em colunas correlatas (ex. Fortemente correlacionados como mês de nascimento e signo, ou mais fracamente correlted como sexo e altura).

No entanto, não é perfeito. Por exemplo estimar a cardinalidade do conjunto de resultados de uma junção entre duas tabelas é razoavelmente precisa, como é estimar a cardinalidade de uma operação de filtro, mas a combinação dos dois requer muita estimativa que pode facilmente ser imprecisa. Em alguns casos estas questões pode ser contornado com sugestões, ou com o uso de tabelas temporárias globais para conjuntos de resultados intermediários.

Um outro problema das estatísticas é que alterá-los pode alterar o plano de execução, para que haja mais de um movimento recentemente, quer desencorajar encontro contínuo de estatísticas, ou para analisar o impacto das mudanças com as estatísticas antes de implementá-los.

Procure o livro Jonathan Lewis -. É um tratamento muito aprofundada do assunto

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top