Caro chiappa e demais colegas
Não sei se expressei bem, mas a dúvida que tenho é sobre o uso do índice dessa tabela no oracle8i. É o seguinte, coletei as estatísticas novamente, dessa vez somente usando a dbms_stats com size 10. Mesmo assim a query não utiliza o índice e faz um full na tabela, porém quando faço um select count(*) do mesmo select o índice é usado, não entedi. Sobre o 9i, o que eu fiz foi importar a mesma tabela, deletar as estatísticas, coletei da mesma forma com a dbms_stats size 10 e aí sim ele passou a usar o índice, funcionou beleza o problema e que isso não acontece no 8i. Segue a demonstração no oracle8i. Para acrescentar segue a configuração de alguns parâmetros object_cache_optimal_size integer 102400 optimizer_features_enable string 8.1.7 optimizer_index_caching integer 90 optimizer_index_cost_adj integer 35 optimizer_max_permutations integer 20000 optimizer_mode string FIRST_ROWS optimizer_percent_parallel integer 0 ***************** Teste no 8i ******************************************* SQL> BEGIN 2 sys.dbms_stats.gather_table_stats(ownname=>'ADMRPC', tabname=>'RPC_DOCM_DIGITADO',granularity= >'ALL',method_opt=>'FOR ALL COLUMNS SIZE 10', estimate_percent=>NULL,cascade=>TRUE, DEGREE=>6); 3 END; 4 / Procedimento PL/SQL concluído com sucesso. SQL> set autotrace trace exp SQL> Select * from rpc_docm_digitado x where x.bpa_docm_ext_codigo is not null; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=12383 Card=1 Byt es=186) 1 0 TABLE ACCESS (FULL) OF 'RPC_DOCM_DIGITADO' (Cost=12383 Card=1 Bytes=186) Mesmo select com o count(*) SQL> SELECT COUNT(*) FROM (Select * from rpc_docm_digitado x where x.bpa_docm_ext_codigo is not null); Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=1 Card=1 Bytes=1 ) 1 0 SORT (AGGREGATE) 2 1 INDEX (FULL SCAN) OF 'IXBPADOCMEXT_RPC_DOCM_DIG' (UNIQUE) (Cost=1 Card=1 Bytes=1) Sobre histogramas surgiram algumas dúvidas: Na documentação do comando analyze, realmente diz que deve ser usada a cláusula SIZE para coletas dos histogramas, porém achei no site asktom uma resposta do Tom que reproduzo abaixo, ele diz que o comando sem o SIZE já é o suficiente para ser coletado os histogramas. http://asktom.oracle.com/pls/ask/f?p=4950:8:4621149779337497069::NO::F4950_P 8_DISPLAYID,F4950_P8_CRITERIA:707586567563 You Asked ( <javascript:latestFollowup();> Jump to Tom's latest followup) Tom Can you give a simple example of how to create a histogram, to see the performance of a query? and we said... Sure, run a script like this: create table t as select 1 X, rpad('*',4000,'*') data from all_objects a / insert into t select 2, rpad('*',4000,'*') from all_objects a where rownum = 1 / create index t_idx on t(x) / alter session set sql_trace=true; select count(data) from t t1 where x = 1; select count(data) from t t1 where x = 2; analyze table t compute statistics for table for all indexes for all indexed columns; select count(data) from t t2 where x = 1; select count(data) from t t2 where x = 2; (the for all indexed columns got the histograms for us on the indexed column X)... Enfim, fiz um teste deletando as estatísticas de uma tabela e coletando-as de três maneiras diferentes, todas incluem na dba_histograms, sendo que os valores da coluna ENDPOINT_NUMBER são iguais para os dois últimos. Afinal é ou não é necessário colocar o SIZE ??? analyze table ADMREF.REF_CAPITULACAO_LEGAL COMPUTE statistics ; analyze table ADMREF.REF_CAPITULACAO_LEGAL COMPUTE statistics for TABLE for all indexes for all indexed columns; analyze table ADMREF.REF_CAPITULACAO_LEGAL COMPUTE statistics for TABLE for all indexes for all indexed columns size 10; ; Um abraço Alex Borges _____ De: jlchiappa [mailto:[EMAIL PROTECTED] Enviada em: sexta-feira, 20 de outubro de 2006 10:52 Para: oracle_br@yahoogrupos.com.br Assunto: [oracle_br] Re: ÍNDICE FUNCIONA NO 9i E NÃO FUNC IONA NO 8I Alex, primeira coisa : esses dois comandos de coleta que vc cita são ABSOLUTAMENTE diferentes no seu caso, pois no analyze vc ** NÂO ** pediu pra criar histogramas (seria a opção SIZE que no analyze vc não deu), e no dbms_stats vc especificou SIZE 10, tem histogramas portanto, só isso já poderia explicar, ok ? Provavelmente quando vc exportou pro 9i, vc exportou depois de ter feito o DBMS_STATS com SIZE 10, PORTANTO foi com histogramas, PORTANTO usou normalmente.... Recomendo que vc dê uma estudada no manual de Tunning e uma pesquisada nas msgs antigas do grupo E em http://asktom.oracle.com, <http://asktom.oracle.com,> histogramas são assunto frequente... []s Chiappa =========================================================== Participe do ENPO - Encontro de Profissionais Oracle 2006 ! Informações e inscrições em www.enpo-br.org José Laurindo Chiappa, Palestrante ENPO-2006 =========================================================== --- Em oracle_br@yahoogrupos.com.br, "alex_borges" <[EMAIL PROTECTED]> escreveu > > Caros colegas > > oracle 8.1.7.4 enterprise > windows 2000 advanced server > > > Tenho a tabela abaixo com mais de 4 milhoes de registros que contém > um índice na coluna bpa_docm_ext_codigo. > Já coletei as estatísticas das duas maneiras abaixo: > > > analyze table ADMRPC.RPC_DOCM_DIGITADO compute statistics for TABLE > for all indexes for all indexed columns ; > > > BEGIN > sys.dbms_stats.gather_table_stats(ownname=>'ADMRPC', > tabname=>'RPC_DOCM_DIGITADO',granularity=>'ALL',method_opt=>'FOR ALL > COLUMNS SIZE 10', > estimate_percent=>NULL,cascade=>TRUE, DEGREE=>6); > END; > > > > > Quando executo o primeiro select ocorre o full scan , mas o segundo > usa o índice , alguém sabe me dizer porque? > só existe um registro com esse campo preenchido todos os demais estão > nulos. Exportei a tabela para versão 9i e o índice foi usado conforme > esperado. > > > > > > SQL> select count(*) from rpc_docm_digitado where BPA_DOCM_EXT_CODIGO > is null; > > COUNT(*) > ---------- > 4465688 > > Decorrido: 00:00:25.87 > SQL> select count(*) from rpc_docm_digitado where BPA_DOCM_EXT_CODIGO > =81; > > COUNT(*) > ---------- > 1 > > > > -- primeiro select----------- > > > SQL> Select * from rpc_docm_digitado x where > 2 x.bpa_docm_ext_codigo is not null; > Decorrido: 00:00:00.00 > > Execution Plan > ---------------------------------------------------------- > 0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=12383 Card=1 > Bytes=186) > > 1 0 TABLE ACCESS (FULL) OF 'RPC_DOCM_DIGITADO' (Cost=12383 > Card=1 Bytes=186) > > > > > > > -- segundo select > > SQL> SELECT COUNT(*) FROM (Select * from rpc_docm_digitado x where > 2 x.bpa_docm_ext_codigo is not null); > Decorrido: 00:00:00.15 > > Execution Plan > ---------------------------------------------------------- > 0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=1 Card=1 > Bytes=1) > > 1 0 SORT (AGGREGATE) > 2 1 INDEX (FULL SCAN) OF 'IXBPADOCMEXT_RPC_DOCM_DIG' > (UNIQUE) (Cost=1 Card=1 Bytes=1) > [As partes desta mensagem que não continham texto foram removidas] Vem aí: ENPO-BR 2006 - Encontro Nacional de Profissionais Oracle VISITE: http://www.enpo-br.org/ - Dia 11/11 "Vagas Limitadas" ________________________________________________________________ Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine -------------------------------------------------------------------------------------------------------------------------- Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -------------------------------------------------------------------------------------------------------------------------- O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: WWW.ORACLEBR.COM.BR ------------------------------------------------------------------------------------------------------------------------ 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