Correto!

--- Em oracle_br@yahoogrupos.com.br, "jlchiappa" <[EMAIL PROTECTED]> 
escreveu
> Veja, a idéia do ESTIMATE é pra aqueles casos como o meu, onde eu 
> tenho uma tabela de 1 bilhão de linhas, analizar na íntegra 100%  é 
> simplesmente ** inviável **, então vc informa um percentual, esse 
> percentual pode ser de linhas da tabela OU de blocos, cfrme o 
> parâmetro BLOCK_SAMPLE for falso ou verdadeiro. A tabela-exemplo do 
> Márico era pequena, ** lógico ** que dava pra fazer um COMPUTE (ie, 
> não estimar nada, analizar ela todinha), mas ele quis mostrar que o 
> conceito de ESTIMATE funciona , certo ??
> 
> []s
> 
>  Chiappa
> 
> --- Em oracle_br@yahoogrupos.com.br, falmeida <[EMAIL PROTECTED]> 
escreveu
> > Olá Chiappa e Márcio,
> > 
> > Eu acabei esquecendo de comentar. Lá no artigo você usa:
> > 
> > estimate_percent => 10,
> > 
> > Isto significa que você está somente pegando 10% das linhas para 
> fazer
> > a análise dos dados? Se sim, não seria melhor usar 100%? Quando 
não
> > indicamos o valor dafault é 100%?
> > 
> > Desde já agradeço,
> > 
> > Fabão.
> > 
> > P.S. Até uma hora destas aqui... caramba...
> > 
> > Em 24/11/05, jlchiappa<[EMAIL PROTECTED]> escreveu:
> > > Márcio, eu li a entrada sobre SIZE do seu blog e tenho um item a
> > > adicionar, vou faze-lo aqui pra que mais gente se eventualmente 
se
> > > beneficie. É o seguinte, quando vc não informa o SIZE, ** não 
** é
> > > sempre que o "Oracle faz o trabalho" - o que ocorre é que, SE o 
> número
> > > de valores distintos for nitidamente menor que o número de 
buckets
> > > mínimo do banco (por volta de uns 70), isso funciona bem, mas 
se 
> não
> > > for isso, vc pode ter problemas. Exemplo :
> > >
> > > Conectado a:
> > > Oracle9i Enterprise Edition Release 9.2.0.5.0 - Production
> > > With the Partitioning, Oracle Label Security, OLAP and Oracle 
Data
> > > Mining options
> > > JServer Release 9.2.0.5.0 - Production
> > >
> > > [EMAIL PROTECTED]:SQL>create table TEST (n1 number not null);
> > >
> > > Tabela criada.
> > >
> > > ==> vamos ter apenas 4 valores distintos, pra início
> > >
> > > [EMAIL PROTECTED]:SQL>BEGIN
> > >  2     FOR I IN 1..5 LOOP
> > >  3        INSERT INTO TEST (SELECT I FROM ALL_OBJECTS WHERE 
> ROWNUM <
> > > I*I);
> > >  4        COMMIT;
> > >  5     END LOOP;
> > >  6  END;
> > >  7  /
> > >
> > > Procedimento PL/SQL concluído com sucesso.
> > >
> > > [EMAIL PROTECTED]:SQL>exec dbms_stats.gather_table_stats(user, 'TEST',
> > > cascade =>TRUE, method_opt=>'for columns n1');
> > >
> > > Procedimento PL/SQL concluído com sucesso.
> > >
> > > [EMAIL PROTECTED]:SQL>select count(*) from user_histograms where
> > > table_name='TEST';
> > >
> > >          COUNT(*)
> > > ------------------
> > >                 4
> > >
> > > [EMAIL PROTECTED]:SQL>SELECT COLUMN_NAME, NUM_DISTINCT, LOW_VALUE,
> > > HIGH_VALUE, DENSITY, NUM_NULLS, NUM_BUCKETS, SAMPLE_SIZE FROM
> > > USER_TAB_COLUMNS WHERE TABLE_NAME='TEST';
> > >
> > > COLUMN_NAME                          NUM_DISTINCT LOW_VALUE
> > >                                             HIGH_VALUE
> > >                                                   DENSITY
> > > NUM_NULLS        NUM_BUCKETS        SAMPLE_SIZE
> > > ------------------------------ ------------------
> > > ----------------------------------------------------------------
> > > ----------------------------------------------------------------
> > > ------------------ ------------------ ------------------
> > > ------------------
> > > N1                                              4 C103
> > >                                             C106
> > >                                                       ,01
> > >      0                  3                 50
> > >
> > > [EMAIL PROTECTED]:SQL>SELECT MIN(N1), DUMP(MIN(N1), 16) ,  MAX(N1),
> > > DUMP(MAX(N1), 16) FROM TEST;
> > > [EMAIL PROTECTED]:SQL>/
> > >
> > >           MIN(N1)
> > > ------------------
> > > DUMP(MIN(N1),16)
> > > ----------------------------------------------------------------
--
> --------------------------------------------------------------------
--
> --------------------------------------------------------------------
--
> --------------------------------------------------------------------
--
> -----------
> > >           MAX(N1)
> > > ------------------
> > > DUMP(MAX(N1),16)
> > > ----------------------------------------------------------------
--
> --------------------------------------------------------------------
--
> --------------------------------------------------------------------
--
> --------------------------------------------------------------------
--
> -----------
> > >                 2
> > > Typ=2 Len=2: c1,3
> > >                 5
> > > Typ=2 Len=2: c1,6
> > >
> > > ==> ok, vamos usar :
> > >
> > > [EMAIL PROTECTED]:SQL>set autotrace traceonly;
> > > [EMAIL PROTECTED]:SQL>select * from test where n1=3;
> > >
> > > 8 linhas selecionadas.
> > >
> > >
> > > Plano de Execução
> > > ----------------------------------------------------------
> > >   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=8 
> Bytes=24)
> > >   1    0   TABLE ACCESS (FULL) OF 'TEST' (Cost=2 Card=8 
Bytes=24)
> > >
> > > Estatística
> > > ----------------------------------------------------------
> > >          0  recursive calls
> > >          0  db block gets
> > >          8  consistent gets
> > >          0  physical reads
> > >          0  redo size
> > >        443  bytes sent via SQL*Net to client
> > >        499  bytes received via SQL*Net from client
> > >          2  SQL*Net roundtrips to/from client
> > >          0  sorts (memory)
> > >          0  sorts (disk)
> > >          8  rows processed
> > >
> > > [EMAIL PROTECTED]:SQL>set autotrace off
> > >
> > > ==> vamos recoletar com size maior :
> > >
> > > [EMAIL PROTECTED]:SQL>exec dbms_stats.gather_table_stats(user, 'TEST',
> > > cascade =>TRUE, method_opt=>'for columns n1 size 5');
> > >
> > > Procedimento PL/SQL concluído com sucesso.
> > >
> > > [EMAIL PROTECTED]:SQL>select count(*) from user_histograms where
> > > table_name='TEST';
> > >
> > >          COUNT(*)
> > > ------------------
> > >                 4
> > >
> > > [EMAIL PROTECTED]:SQL>SELECT COLUMN_NAME, NUM_DISTINCT, LOW_VALUE,
> > > HIGH_VALUE, DENSITY, NUM_NULLS, NUM_BUCKETS, SAMPLE_SIZE FROM
> > > USER_TAB_COLUMNS WHERE TABLE_NAME='TEST';
> > >
> > > COLUMN_NAME                          NUM_DISTINCT LOW_VALUE
> > >                                             HIGH_VALUE
> > >                                                   DENSITY
> > > NUM_NULLS        NUM_BUCKETS        SAMPLE_SIZE
> > > ------------------------------ ------------------
> > > ----------------------------------------------------------------
> > > ----------------------------------------------------------------
> > > ------------------ ------------------ ------------------
> > > ------------------
> > > N1                                              4 C103
> > >                                             C106
> > >                                          ,229230769230769
> > >      0                  3                 50
> > >
> > > [EMAIL PROTECTED]:SQL>set autotrace traceonly
> > > [EMAIL PROTECTED]:SQL>select * from test where n1=3;
> > >
> > > 8 linhas selecionadas.
> > >
> > > Plano de Execução
> > > ----------------------------------------------------------
> > >   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=11 
> Bytes=33)
> > >   1    0   TABLE ACCESS (FULL) OF 'TEST' (Cost=2 Card=11 
Bytes=33)
> > >
> > > Estatística
> > > ----------------------------------------------------------
> > >          0  recursive calls
> > >          0  db block gets
> > >          8  consistent gets
> > >          0  physical reads
> > >          0  redo size
> > >        443  bytes sent via SQL*Net to client
> > >        499  bytes received via SQL*Net from client
> > >          2  SQL*Net roundtrips to/from client
> > >          0  sorts (memory)
> > >          0  sorts (disk)
> > >          8  rows processed
> > >
> > > ==> cardinalidade passou de 8 pra 11, é ruído, diferença tão 
> pequena
> > > que é desprezível, teste IGUAIS na prática. AGORA vamos ter mais
> > > valores distintos...
> > >
> > > [EMAIL PROTECTED]:SQL>set autotrace off
> > > [EMAIL PROTECTED]:SQL>truncate table test;
> > >
> > > Tabela truncada.
> > >
> > > [EMAIL PROTECTED]:SQL>BEGIN
> > >  2     FOR I IN 1..125 LOOP
> > >  3        INSERT INTO TEST (SELECT I FROM ALL_OBJECTS WHERE 
> ROWNUM <
> > > I*I);
> > >  4        COMMIT;
> > >  5     END LOOP;
> > >  6  END;
> > >  7  /
> > >
> > > Procedimento PL/SQL concluído com sucesso.
> > >
> > > [EMAIL PROTECTED]:SQL>SELECT MIN(N1), DUMP(MIN(N1), 16) ,  MAX(N1),
> > > DUMP(MAX(N1), 16) FROM TEST;
> > >
> > >           MIN(N1)
> > > ------------------
> > > DUMP(MIN(N1),16)
> > > ----------------------------------------------------------------
--
> --------------------------------------------------------------------
--
> --------------------------------------------------------------------
--
> --------------------------------------------------------------------
--
> -----------
> > >           MAX(N1)
> > > ------------------
> > > DUMP(MAX(N1),16)
> > > ----------------------------------------------------------------
--
> --------------------------------------------------------------------
--
> --------------------------------------------------------------------
--
> --------------------------------------------------------------------
--
> -----------
> > >                 2
> > > Typ=2 Len=2: c1,3
> > >               125
> > > Typ=2 Len=3: c2,2,1a
> > >
> > >
> > > ==> primeiro vamos coletar como vc sugeriu, sem informar bucket 
> size :
> > >
> > > [EMAIL PROTECTED]:SQL>exec dbms_stats.gather_table_stats(user, 'TEST',
> > > cascade =>TRUE, method_opt=>'for columns n1');
> > >
> > > Procedimento PL/SQL concluído com sucesso.
> > >
> > > [EMAIL PROTECTED]:SQL>select count(*) from user_histograms where
> > > table_name='TEST';
> > >
> > >          COUNT(*)
> > > ------------------
> > >                64
> > >
> > > => ele fez o número mínimo de buckets - sempre há uma pequena 
> variação
> > > porque o histograma que o Oracle usa é height-based 
> (por "altura"),
> > > isto é, ele sempre quer a mesmo quantidade de valores distintos 
em
> > > cada "caixa", mais 1 ou menos 1...
> > >
> > > [EMAIL PROTECTED]:SQL>SELECT COLUMN_NAME, NUM_DISTINCT, LOW_VALUE,
> > > HIGH_VALUE, DENSITY, NUM_NULLS, NUM_BUCKETS, SAMPLE_SIZE FROM
> > > USER_TAB_COLUMNS WHERE TABLE_NAME='TEST';
> > >
> > > COLUMN_NAME                          NUM_DISTINCT LOW_VALUE
> > >                                             HIGH_VALUE
> > >                                                   DENSITY
> > > NUM_NULLS        NUM_BUCKETS        SAMPLE_SIZE
> > > ------------------------------ ------------------
> > > ----------------------------------------------------------------
> > > ----------------------------------------------------------------
> > > ------------------ ------------------ ------------------
> > > ------------------
> > > N1                                            124 C103
> > >                                             C2021A
> > >                                         ,0122118731219246
> > >      0                 63             658750
> > >
> > > ==> atenção ao campo DENSITY acima... Vamos fazer uma query :
> > >
> > > [EMAIL PROTECTED]:SQL>set autotrace traceonly
> > > [EMAIL PROTECTED]:SQL>SELECT * FROM TEST WHERE N1=20;
> > >
> > > 399 linhas selecionadas.
> > >
> > >
> > > Plano de Execução
> > > ----------------------------------------------------------
> > >   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=98 Card=8045
> > > Bytes=32180)
> > >   1    0   TABLE ACCESS (FULL) OF 'TEST' (Cost=98 Card=8045 
> Bytes=32180)
> > >
> > > Estatística
> > > ----------------------------------------------------------
> > >          0  recursive calls
> > >          0  db block gets
> > >       1032  consistent gets
> > >        491  physical reads
> > >          0  redo size
> > >       5571  bytes sent via SQL*Net to client
> > >        785  bytes received via SQL*Net from client
> > >         28  SQL*Net roundtrips to/from client
> > >          0  sorts (memory)
> > >          0  sorts (disk)
> > >        399  rows processed
> > >
> > > ==> humm, cardinalidade de 8405, tá. vamos agora ** indicar ** o
> > > número de buckets para ser mais próximo do valor real de 
distintos
> > > (qundo vc não informa o size, o bd Oracle ** não ** faz 
isso !!) :
> > >
> > > [EMAIL PROTECTED]:SQL>set autotrace off
> > > [EMAIL PROTECTED]:SQL>exec dbms_stats.gather_table_stats(user, 'TEST',
> > > cascade =>TRUE, method_opt=>'for columns n1 size 125');
> > >
> > > Procedimento PL/SQL concluído com sucesso.
> > >
> > > [EMAIL PROTECTED]:SQL>select count(*) from user_histograms where
> > > table_name='TEST';
> > >
> > >          COUNT(*)
> > > ------------------
> > >                78
> > >
> > > [EMAIL PROTECTED]:SQL>SELECT COLUMN_NAME, NUM_DISTINCT, LOW_VALUE,
> > > HIGH_VALUE, DENSITY, NUM_NULLS, NUM_BUCKETS, SAMPLE_SIZE FROM
> > > USER_TAB_COLUMNS WHERE TABLE_NAME='TEST';
> > >
> > > COLUMN_NAME                          NUM_DISTINCT LOW_VALUE
> > >                                             HIGH_VALUE
> > >                                                   DENSITY
> > > NUM_NULLS        NUM_BUCKETS        SAMPLE_SIZE
> > > ------------------------------ ------------------
> > > ----------------------------------------------------------------
> > > ----------------------------------------------------------------
> > > ------------------ ------------------ ------------------
> > > ------------------
> > > N1                                            124 C103
> > >                                             C2021A
> > >                                        ,00747264610999656
> > >      0                 77             658750
> > >
> > > ==> humm, além de ter mais buckets, a DENSIDADE mudou (claro, os
> > > valores estão mais distribuídos, por mais "caixas"). ok, vamos 
> usar :
> > >
> > > [EMAIL PROTECTED]:SQL>set autotrace traceonly
> > > [EMAIL PROTECTED]:SQL>SELECT * FROM TEST WHERE N1=20;
> > >
> > > 399 linhas selecionadas.
> > >
> > > Plano de Execução
> > > ----------------------------------------------------------
> > >   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=98 Card=4923
> > > Bytes=19692)
> > >   1    0   TABLE ACCESS (FULL) OF 'TEST' (Cost=98 Card=4923 
> Bytes=19692)
> > >
> > >
> > > Estatística
> > > ----------------------------------------------------------
> > >          0  recursive calls
> > >          0  db block gets
> > >       1032  consistent gets
> > >        519  physical reads
> > >          0  redo size
> > >       5571  bytes sent via SQL*Net to client
> > >        785  bytes received via SQL*Net from client
> > >         28  SQL*Net roundtrips to/from client
> > >          0  sorts (memory)
> > >          0  sorts (disk)
> > >        399  rows processed
> > >
> > > ===>> SANTO VALOR , Batman!! A mesma query, com os MESMOS 
dados, 
> mas a
> > > cardinalidade caiu quase pela METADE, de 8045 para 4923 !!! E é 
> claro,
> > > sabemos nós que a CARDINALIDADE é um item-CHAVE pro CBO tomar
> > > decisões... Então, se isto fosse um JOIN, ** muito ** 
> provavelmente o
> > > plano IRIA mudar !! veja só, a ** mesma ** query, com os ** 
> mesmos **
> > > dados, só por ter sido informado mais detalhadamente a info
> > > necessária, muda radicalmente...
> > >
> > > Antes que neguinho pergunte, só pra mostrar que não tem ** nada 
> ** a
> > > ver com caches, ordem de execução, nada disso, faço de novo sem
> > > informar size :
> > >
> > > [EMAIL PROTECTED]:SQL>exec dbms_stats.gather_table_stats(user, 'TEST',
> > > cascade =>TRUE, method_opt=>'for columns n1');
> > >
> > > Procedimento PL/SQL concluído com sucesso.
> > >
> > > [EMAIL PROTECTED]:SQL>select count(*) from user_histograms where
> > > table_name='TEST';
> > >
> > >          COUNT(*)
> > > ------------------
> > >                64
> > >
> > > [EMAIL PROTECTED]:SQL>SELECT COLUMN_NAME, NUM_DISTINCT, LOW_VALUE,
> > > HIGH_VALUE, DENSITY, NUM_NULLS, NUM_BUCKETS, SAMPLE_SIZE FROM
> > > USER_TAB_COLUMNS WHERE TABLE_NAME='TEST';
> > >
> > > COLUMN_NAME                          NUM_DISTINCT LOW_VALUE
> > >                                             HIGH_VALUE
> > >                                                   DENSITY
> > > NUM_NULLS        NUM_BUCKETS        SAMPLE_SIZE
> > > ------------------------------ ------------------
> > > ----------------------------------------------------------------
> > > ----------------------------------------------------------------
> > > ------------------ ------------------ ------------------
> > > ------------------
> > > N1                                            124 C103
> > >                                             C2021A
> > >                                         ,0122118731219246
> > >      0                 63             658750
> > >
> > > [EMAIL PROTECTED]:SQL>set autotrace traceonly
> > > [EMAIL PROTECTED]:SQL>SELECT * FROM TEST WHERE N1=20;
> > >
> > > 399 linhas selecionadas.
> > >
> > >
> > > Plano de Execução
> > > ----------------------------------------------------------
> > >   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=98 Card=8045
> > > Bytes=32180)
> > >   1    0   TABLE ACCESS (FULL) OF 'TEST' (Cost=98 Card=8045 
> Bytes=32180)
> > >
> > >
> > >
> > >
> > > Estatística
> > > ----------------------------------------------------------
> > >          0  recursive calls
> > >          0  db block gets
> > >       1032  consistent gets
> > >        576  physical reads
> > >          0  redo size
> > >       5571  bytes sent via SQL*Net to client
> > >        785  bytes received via SQL*Net from client
> > >         28  SQL*Net roundtrips to/from client
> > >          0  sorts (memory)
> > >          0  sorts (disk)
> > >        399  rows processed
> > >
> > > [EMAIL PROTECTED]:SQL>
> > >
> > > []s
> > >
> > >  Chiappa
> > >
> > > --- Em oracle_br@yahoogrupos.com.br, "Marcio Portes"
> > > <[EMAIL PROTECTED]> escreveu
> > > > Escrevi outra notinha lá.
> > > >
> > > > http://mportes.blogspot.com/2005/11/histograma-definio-
size.html
> > > >
> > > > Abraço,
> > > >
> > > > --- Em oracle_br@yahoogrupos.com.br, "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

<*> 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