Opa, então : na verdade, é Documentado que a partir da versão 10g iirc (vide manual SQL Reference no comando CREATE INDEX) que automaticamente após a criação de um índice o RDBMS coleta estatísticas NO ÍNDICE, mas na tabela isso não ocorre, e o histograma é uma Atribuição em princípio DA TABELA, ok ? Via de regra, o índice é consulta com a Chave completa, então óbvio que a cardinalidade do índice em si em tese é 1, a chave completa vai trazer um e apenas um registro... Também é Documentado que :
- caso não haja estatísticas para uma tabela, o RDBMS pode fazer uma coleta por conta - a profundidade desse sample automático é Gerenciada no parâmetro optimizer_dynamic_sampling - por default, se o DBA não opor nada, o RDBMS Oracle agenda uma coleta Automática de estatísticas nas tabelas todas para a janela de manutenção, que normalmente é à noite ==> assim, se tudo está default, caso o DBA se esqueça de fazer uma coleta na tabela , na próxima janela de manutenção o RDBMS faz uma coleta default, E enquanto isso não ocorre o otimizador tenta fazer coletas simplificadas se a tabela não tiver estatísticas coletadas ainda... Um exemplo curto mostrando a não-criação : -> crio a tabela e um índice : SYSTEM:@O11GR2:SQL>create table TAB_TEST_STAT (c1 number); Tabela criada. SYSTEM:@O11GR2:SQL>insert into TAB_TEST_STAT values (1); 1 linha criada. SYSTEM:@O11GR2:SQL>create index IDX_TEST_STAT on TAB_TEST_STAT(c1); Índice criado. => resultado ref. estatísticas : tabela NÂO as tem, índice tem : SYSTEM:@O11GR2:SQL>select last_analyzed from user_tables where table_name='TAB_TEST_STAT'; LAST_ANA -------- SYSTEM:@O11GR2:SQL>select last_analyzed from user_indexes where table_name='TAB_TEST_STAT'; LAST_ANA -------- 05/08/14 ==> mas de Histogramas, neca, ATÉ PORQUE histogramas são em princípio atributo da tabela : SYSTEM:@O11GR2:SQL>select column_name, num_distinct, density, num_nulls, num_buckets, histogram 2 from user_tab_col_statistics 3 where table_name ='TAB_TEST_STAT'; nao há linhas selecionadas SYSTEM:@O11GR2:SQL>select * from user_histograms where table_name='TAB_TEST_STAT'; nao há linhas selecionadas ==> coleto : SYSTEM:@O11GR2:SQL>exec dbms_stats.gather_table_stats(ownname=>'SYSTEM', tabname=>'TAB_TEST_STAT', cascade=>TRUE,estimate_percent=>null, method_opt=>'FOR ALL COLUMNS SIZE AUTO'); Procedimento PL/SQL concluído com sucesso. => aí estão presentes - OBVIAMENTE, esse histograma é de size mínimo, normalmente Inapropriado, mas está aqui : SYSTEM:@O11GR2:SQL>select * from user_histograms where table_name='TAB_TEST_STAT'; TABLE_NAME COLUMN_NAME ENDPOINT_NUMBER ENDPOINT_VALUE ------------------------------ ------------------------------ --------------- -------------- ENDPOINT_ACTUAL_VALUE --------------------------------------------------------------------------------------------------------------------------------- TAB_TEST_STAT C1 0 1 TAB_TEST_STAT C1 1 1 SYSTEM:@O11GR2:SQL> SYSTEM:@O11GR2:SQL>select last_analyzed from user_tables where table_name='TAB_TEST_STAT'; LAST_ANA -------- 05/08/14