Pular para o conteúdo
  • Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 10 anos, 3 meses atrás por Avatar de Fábio PradoFábio Prado.
Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Autor
    Posts
  • #106805
    Avatar de WiliamWiliam
    Participante

      Pessoal,

      Achei um link que explica uma situação que fiquei na dúvida, segue:

      http://mportes.blogspot.com.br/2005/11/histograma-introduo.html

      Imagine o seguinte exemplo: Na cidade de São Paulo o conjunto de torcedores de times de futebol é distribuído segundo a tabela abaixo:

      torce_para count(*)
      ————– ———-
      São Paulo 4.000.000

      Corinthians 8.000.000
      Palmeiras 6.000.000
      Santos 2.000.000
      VOCEM de Assis 8

      Se existe um índice em torce_para e uma query pedir os torcedores do VOCEM de Assis, é muito provável que o Oracle fará full table scan.

      Mas por que?
      É muito mais barato para o Oracle fazer um FTS que um acesso a milhões de linhas do índice.

      Mas existe só 8 torcedores do VOCEM, como assim milhões de linhas?
      Então sem histograma a coleta de estatística para o índice será mais ou menos (total de linhas tabela) / (seletividade do índice) então 20 milhões / 5 = 4 milhões de registros aproximadamente por valor distinto no índice (Cálculo muito a grosso modo
      Um colega, reproduziu o cenário no PostgreSQL e quando executou a query:

      SELECT * FROM TORCEDORES WHERE TORCE_PARA = “VOCEM de Assis”

      o PostgreSQL utilizou o indice certinho, segundo ele ao criar o indice já foi criado um HISTOGRAMA que já detalhou a distribuição dos dados na tabela. Entao o Otimizador ao elaborar o plano corretamente, utilizando o índice.
      Minha questão é: ao criar um índice no Oracle, será que ele já cria um Histograma automaticamente? Pois se acontecer isso, esse cenário reportado no link, está incorreto… nao faz sentido.

      #106812
      Avatar de Fábio PradoFábio Prado
      Participante

        William,

        Existem muitas variantes que influenciam se o otimizador vai usar ou não um índice. Na configuração padrão do Oracle, se existir um histograma na coluna “torce_para”, os filtros por Corinthians farão FTS e por VOCEM farão IS, ok?

        Por que o Otimizador deixa de usar o índice ao filtrar por Corinthians? Pq índices do tipo b-tree só são eficientes se vc retornar poucas linhas, ok?

        []s

      Visualizando 2 posts - 1 até 2 (de 2 do total)
      • Você deve fazer login para responder a este tópico.
      plugins premium WordPress