Olá Márcio,

Antes de mais nada, peço desculpas por te torrar a paciência.

Realmente me referia ao artigo de ontem - Histograma. E faço alguns
comensários, a seguir.

Acho isto no Oracle muito "doido". Eu fiquei desconfiado que quando
você executasse já utilizando o histograma os selects:
SQL> select * from t where x_hist = 2;
ou
SQL> select * from t where x_hist = 5;
utilizariam o índice. Só usou na segunda query. .

Depois, com a criação do bitmap index o resultado foi FTS nas duas daí
quando você força o índice, o custo da que ele fez full e menor da que
ele usou índice.

Acho isto incongruente, pois imagine se você tivesse não 10 times, mas
sim 100 times, e em cada um tivesse 1.000.000 e em um deles apenas 5
torcedores. Ora, se eu estivesse acessando um dos times que tem
1.000.000 de torcedores, mesmo com o custo de ir no indice e depois na
tabela seria melhor do que percorrer os praticamente 100.000.000
registros da tabela. Se colocassemos um indice do tipo arvore
balanceada sobre o campo em questão, ele deveria encontrar rapidamente
pelo ponteiro vertical onde iniciava o primeiro bloco onde a chave
procurada se encontrava e a partir daí percorreria todos os blocos a
direita desta árvore até não mais encontrar registros para chave
procurada. Para cada registro encontrado nesta pesquisa, ele deveria
acessar via rowid a linha na tabela. Vale lembrar que quando
computamos a estatistica conseguimos ver a profundidade da árvore do
índice. Em um DISCO IDE com tempo de acesso médio de 8ms, e uma árvore
gigantesca com profundidade de 6 (eu particularmente eu nunca vi
nenhum índice com esta profundidade) observaremos que ele iria
encontrar o primeiro elemento e 7*8 = 56ms (7 por que temos que
acessar um bloco raiz). A partir daí é só percorrer blocos a direita.
Isto é extremamente rápido. Depois para cada registro encontrado ir no
bloco apontado pelo rowid. Lembro também que num bloco de índice cabem
inúmeras entradas (ponteiros) e que num bloco de dados vários
registros. Concluindo, poderiamos aqui fazer uma estimativa de quantas
entradas caberiam nos blocos de índices e depois quantas linhas
caberiam em um bloco de dados, mas acho que o plano de execução é
muito ruim nestes casos. Não consigo entender o que o programador da
Oracle estava pensando quando decidiu fazer o banco trabalhar desta
forma. Critico sim, pois trabalhei a vida toda com um SO/Linguagem
chamado MUMPS (hoje tem seu sucessor Caché - que é um banco da geração
pós-relacional) que era super eficiente em termos de busca em árvore.
Hoje concluo que a opção choose como padrão a pior escolha, pois o
critério que o Oracle escolhe, na minha opinião, é muito
"preconceituoso", duvidoso e não intuitivo. Hoje, eu deixo o banco em
RULE e analiso o tempo de resposta, e não um suposto custo que eu não
compreendo a lógica de sua apuração.

Cabe um esclarecimento aqui. Minhas palavras não são para agredir,
ofender, nem denegrir, ninguém, nem ao produto com o qual venho
trabalhando e é o meu "ganha pão". Só queria .... entender..... :-p

Cordialmente e abraços a todos por me aturar e chegar até aqui,

Fabão.

Em 24/11/05, Marcio Portes<[EMAIL PROTECTED]> escreveu:
> Fabão, acredito que voce esteja falando sobre o artigo de ontem
> (Histograma - introdução).
>
> 1) A query que tem um monte de registro vai por FTS. Achei que tinha
>   ficado claro quando executei a primeira query com x_hist = 5 (sem
>   histogramas corretos) que fez full table scan. Mesmo assim aqui
>   está o resultado do autotrace traceonly.
>
> SQL> select * from t where x_hist = 2;
>
>
> 1835197 rows selected.
>
>
> Execution Plan
> ----------------------------------------------------------
>   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2986 Card=1834400
> Bytes=45860000)
>   1    0   TABLE ACCESS (FULL) OF 'T' (Cost=2986 Card=1834400
> Bytes=45860000)
>
>
>
>
> Statistics
> ----------------------------------------------------------
>          0  recursive calls
>          0  db block gets
>      49556  consistent gets
>      31045  physical reads
>        360  redo size
>   54405784  bytes sent via SQL*Net to client
>     202512  bytes received via SQL*Net from client
>      18353  SQL*Net roundtrips to/from client
>          0  sorts (memory)
>          0  sorts (disk)
>    1835197  rows processed
>
> SQL> select * from t where x_hist = 5;
>
> 10 rows selected.
>
>
> Execution Plan
> ----------------------------------------------------------
>   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=1 Bytes=25)
>   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=4 Card=1
> Bytes=25)
>   2    1     INDEX (RANGE SCAN) OF 'T_IDX' (NON-UNIQUE) (Cost=3
> Card=1)
>
>
>
>
> Statistics
> ----------------------------------------------------------
>          0  recursive calls
>          0  db block gets
>          6  consistent gets
>          0  physical reads
>          0  redo size
>        920  bytes sent via SQL*Net to client
>        651  bytes received via SQL*Net from client
>          2  SQL*Net roundtrips to/from client
>          0  sorts (memory)
>          0  sorts (disk)
>         10  rows processed
>
>
>
> 2) Baixa seletividade não é o único argumento para criação de bitmap
>   index. Já imaginou se mesmo com baixa seletividade, o sistema
>   sofre intensa manutenção? Pra onde vai sua performance? Mas sim,
>   seria uma alternativa (desde que bem avaliada em seus efeitos
>   colaterais). no artigo de hoje eu ressalto isso:
>
> Pedaço do artigo em
> <http://mportes.blogspot.com/2005/11/histograma-definio-size.html>
>   E agora, quando usar histogramas?
>   Sempre que NÃO exista uniformidade na distribuição de valores
>   sobre o grupo. Voltando ao exemplo dos torcedores, se em nosso
>   conjunto não tivéssemos os torcedores do VOCEM, não seria
>   interessante usar histogramas, porque não ganharíamos nada,
>   haveria necessidade de estudar melhor os dados e talvez usar
>   bitmap, cluster, etc. Tudo depende, mas se há distruibuição
>   ^^^^^^  ^^^^^^^  ^^^
>   uniforme no grupo ou constante variação de valores distintos, a
>   coluna não é candidata ao histograma. Outra ocasião onde
>   deveríamos evitar o histograma é quando a coluna é comparada com
>   bind variable. De novo o exemplo, se o campo torce_para for
>   comparado com bind variable, ele não é candidado a histogramas. O
>   otimizador precisa conhecer o valor literal da comparação para
>   percorrer os buckets(endpoint_number, endpoint_value).
>
> 3) Só lembrando que o propósito do artigo foi dar uma introdução de
>   histograma, onde um colega da lista perguntou qual a vantagem de
>   usá-lo. O artigo foi elaborado para demonstrar a aplicabilidade do
>   histograma.
>   Mas, vamos a criação do índice e teste.
>
> SQL> create bitmap index t_bm on t ( x_hist ) parallel nologging;
>
> Index created.
>
> SQL> exec dbms_stats.gather_index_stats( user, 'T_BM' )
>
> PL/SQL procedure successfully completed.
>
> SQL> set autotrace traceonly
> SQL> select * from t where x_hist = 2;
>
> 1835197 rows selected.
>
>
> Execution Plan
> ----------------------------------------------------------
>   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2986 Card=1834400
> Bytes=45860000)
>   1    0   TABLE ACCESS (FULL) OF 'T' (Cost=2986 Card=1834400
> Bytes=45860000)
>
>
>
>
> Statistics
> ----------------------------------------------------------
>          0  recursive calls
>          0  db block gets
>      49551  consistent gets
>      30842  physical reads
>          0  redo size
>   54405784  bytes sent via SQL*Net to client
>     202512  bytes received via SQL*Net from client
>      18353  SQL*Net roundtrips to/from client
>          0  sorts (memory)
>          0  sorts (disk)
>    1835197  rows processed
>
> Deixando o otimizador trabalhar com as estatísticas coletadas ele
> achou melhor fazer FTS.
> Mas vamos forçar o índice.
>
> SQL> select /*+ index(t, t_bm) */ * from t where x_hist = 2;
>
> 1835197 rows selected.
>
>
> Execution Plan
> ----------------------------------------------------------
>   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=15420 Card=1834400
> Bytes=45860000)
>   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=15420
> Card=1834400 Bytes=45860000)
>   2    1     BITMAP CONVERSION (TO ROWIDS)
>   3    2       BITMAP INDEX (SINGLE VALUE) OF 'T_BM'
>
>
>
>
> Statistics
> ----------------------------------------------------------
>          0  recursive calls
>          0  db block gets
>      49475  consistent gets
>      29340  physical reads
>         72  redo size
>   54405784  bytes sent via SQL*Net to client
>     202512  bytes received via SQL*Net from client
>      18353  SQL*Net roundtrips to/from client
>          0  sorts (memory)
>          0  sorts (disk)
>    1835197  rows processed
>
> Praticamente o mesmo esforço, embora o custo tenha sido maior do
> índice em relação ao FTS - (Cost=15420) contra (Cost=2986) na mesma
> cardinalidade 1834400. Acho que seria necessário um tkprof aqui para
> análise mais a fundo, mas como o propósito não era investigar bitmap
> index, vou deixar o script que eu usei para fazer o teste e voce pode
> realizá-lo e postar aqui mais tarde.
>
> drop table t;
>
> create table t nologging as
> select object_id, object_name, mod(rownum, 4) x_hist
>  from all_objects
> /
> insert /*+ append */ into t
> select * from t;
> commit;
> insert /*+ append */ into t
> select * from t;
> commit;
> insert /*+ append */ into t
> select * from t;
> commit;
> insert /*+ append */ into t
> select * from t;
> commit;
> insert /*+ append */ into t
> select * from t;
> commit;
>
> update t set x_hist = 5 where rownum <= 10;
>
> select x_hist, count(*)
>  from t
>  group by rollup(x_hist)
> /
>
> create index t_idx on t (x_hist) parallel 8 nologging;
>
> begin
>  dbms_stats.gather_table_stats(
>     user,
>     'T',
>     estimate_percent => 10,
>     method_opt => 'for columns x_hist size 10',
>     cascade => true,
>     degree => 8 );
> end;
> /
>
> --- Em oracle_br@yahoogrupos.com.br, falmeida <[EMAIL PROTECTED]> escreveu
> > Ola Marcio,
> >
> > Também gostei muito, mas tenho as seguintes perguntas, a saber:
> >
> > 1) Você após ter aplicado o 2 metodo de coleta de estatísticas você
> só
> > rodou a query abaixo:
> >
> > select * from t 2   where x_hist = 5
> >
> > Não seria legal também demonstrar como ficaria com a query que tem
> um
> > monte de registros?
> >
> > select * from t 2   where x_hist = 4
> >
> > 2) Não seria melhor criar um bitmap index, dado que você tem baixa
> > seletividade nesta coluna?
> >
> > 3) Já que você tem estes dados na tabela t poderia criar um indice
> > bitmap e mostrar o resultado aqui?
> >
> > Desde já agradeço,
> >
> > Fabão.
> >
> >
> > Em 24/11/05, Rosiano Vieira de Sales<[EMAIL PROTECTED]> escreveu:
> > > Marcio... dei uma lida no seu blog a respeito e gostei muito da
> nota que vc publicou ....contudo fiquei com uma dúvida ....qual o
> critério para definir o size do historgrama ??? .... se tiver algo a
> respeito envie para o grupo .. vai ser de muito proveito .....
> > >
> > > abç.
> > >
> > > Rosiano
> > >
> > >        -----Mensagem original-----
> > >        De: oracle_br@yahoogrupos.com.br em nome de Marcio Portes
> > >        Enviada: qua 23/11/2005 15:06
> > >        Para: oracle_br@yahoogrupos.com.br
> > >        Cc:
> > >        Assunto: [oracle_br] Re: Histogramas.????
> > >
> > >
> > >
> > >        Welvis, tomei a liberdade de escrever uma pequena
> introdução para sua
> > >        dúvida no meu blog.
> > >        Se interessar:
> > >        http://mportes.blogspot.com/2005/11/histograma-
> introduo.html
> > >
> > >        abraços,
> > >
> > >        --- Em oracle_br@yahoogrupos.com.br, Welvis Douglas Silva
> Moreto
> > >        <[EMAIL PROTECTED]> escreveu
> > >        > Quando devo estar utilizando Histogramas.... quais
> > >        > beneficios terei utilizando o.
> > >        >
> > >        >
> > >        > att,
> > >        >
> > >        > Welvis Douglas
> > >        >
> > >        >
> > >        >
> > >        >
> > >        >
> > >        >
> > >        >
> > >        >
> > >        > _______________________________________________________
> > >        > Yahoo! Acesso Grátis: Internet rápida e grátis.
> > >        > Instale o discador agora!
> > >        > http://br.acesso.yahoo.com/
> > >
> > >
> > >
> > >
> > >
> > >        -----------------------------------------------------------
> ---------------------------------------------------------------
> > >        Atenção! As mensagens deste grupo são de acesso
> público e de inteira responsabilidade de seus remetentes.
> > >        Acesse: http://www.mail-
> archive.com/oracle_br@yahoogrupos.com.br/
> > >        -----------------------------------------------------------
> ---------------------------------------------------------------
> _____________________________________________________________________
> > >        Area de download do grupo -
> http://www.4shared.com/dir/101727/a4dcc423
> > >        Links do Yahoo! Grupos
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > > [As partes desta mensagem que não continham texto foram removidas]
> > >
> > >
> > >
> > > ------------------------------------------------------------------
> --------------------------------------------------------
> > > Atenção! As mensagens deste grupo são de acesso público e de
> inteira responsabilidade de seus remetentes.
> > > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
> > > ------------------------------------------------------------------
> --------------------------------------------------------
> _____________________________________________________________________
> > > Area de download do grupo -
> http://www.4shared.com/dir/101727/a4dcc423
> > > Links do Yahoo! Grupos
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> > >
> >
> >
> > --
> > Fábio Martinho de Almeida
> > Niterói-RJ-Brasil
> >
> > Visite o fotolog: http://fotolog.net/canon_a300
>
>
>
>
> --------------------------------------------------------------------------------------------------------------------------
> Atenção! As mensagens deste grupo são de acesso público e de inteira 
> responsabilidade de seus remetentes.
> Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
> --------------------------------------------------------------------------------------------------------------------------_____________________________________________________________________
> Area de download do grupo - http://www.4shared.com/dir/101727/a4dcc423
> Links do Yahoo! Grupos
>
>
>
>
>
>
>
>


--
Fábio Martinho de Almeida
Niterói-RJ-Brasil

Visite o fotolog: http://fotolog.net/canon_a300


--------------------------------------------------------------------------------------------------------------------------
Atenção! As mensagens deste grupo são de acesso público e de inteira 
responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--------------------------------------------------------------------------------------------------------------------------_____________________________________________________________________
Area de download do grupo - http://www.4shared.com/dir/101727/a4dcc423  
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:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 


Responder a