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