Bom, de início : ** nem sempre ** FULL SCAN é uma porcaria, ** nem
sempre ** acesso via índice é uma maravilha. Vcs tem que ter em mente
o seguinte : SE for acessar apenas algumas linhas na tabela, índice é
excelente, pois o índice é armazenado ordenado, rapidamente se
localiza poucos valores numa lista ordenada, no índice há o endereço
físico em disco das linhas a acessar, é rápido. == AGORA : se a
quantidade de linhyas a se recuperar é uma porção significativa da
tabela (não é só umas poucas) , o trabalho de se varrer a um monte de
linhas no índice pra depois fazer um monte de acessos em disco já não
compensa. Assim a pergunta : é ESTE o caso ou não ??? SE for, o CBO
está absolutamente == CERTO == em escolher FULL SCAN. Se não for
o caso, a quantidade de linhas for pouca e o índice compensaria, é
checar a CONFIGURAÇÂO DO CBO , principalmente os parâmetros optmizer,
tamanhos de PGA, a´sim se pode dizer algo.
[]s
Chiappa
--- Em oracle_br@yahoogrupos.com.br, Rosiano Vieira de Sales
[EMAIL PROTECTED] escreveu
Gabriel,
Estou com problemas semelhante ao seu também fiz igual a
vc ... deletei as estatísticas apenas do índice que me interessava e
o CBO passou a usa-lo ... inclusive com um custo muito menor ... tb
não sei o que acontece e gostaria de saber se alguém da lista
puder nos ajudar ...
Att.
Rosiano
-Mensagem original-
De: oracle_br@yahoogrupos.com.br
[mailto:[EMAIL PROTECTED] Em nome de Gabriel Hanauer
Enviada em: quinta-feira, 23 de junho de 2005 13:59
Para: oracle_br@yahoogrupos.com.br
Assunto: [oracle_br] DBMS_STATS
Olá,
Tenho uma tabela com aproximadamente 250 mil registros. Essa tabela
possui 4 índices . 2 índices compostos com 2 colunas cada e 2
índices
simples. Todas as colunas dos índices sao do tipo number, menos um
índice simples que tem uma coluna char(1).
O que acontece é que toda vez que faço uma consulta usando usando
essa
coluna char(1) na clausula where e que eu esteja selecionando qq
outra
coluna que nao esteja indexada, o CBO escolhe fazer um table access
full.
Isso acontece qdo eu coleto as estatisticas para essa tabela e seus
indices. Se as estatisticas forem deletadas o CBO escolhe usar o
indice.
Já tentei coletar as estatisticas de várias maneiras. Sempre que
possuo estatisticas no indice da coluna char(1) o CBO faz um table
access full
Abaixo vou colocar algumas informações. Se alguém puder me ajudar,
agradeço.
P.S.: Isso está acontecendo em várias consultas diferentes.
SELECT a.cod_lote, a.string_folha
FROM dfen_carga_batch a
WHERE a.tipo_status = 'S'
AND ROWNUM 10
/
Plano de Execução
--
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=25549 Card=9
Bytes=5
472)
10 COUNT (STOPKEY)
21 TABLE ACCESS (FULL) OF 'DFEN_CARGA_BATCH' (Cost=25549
Ca
rd=85811 Bytes=52173088)
Estatística
--
0 recursive calls
0 db block gets
265402 consistent gets
265379 physical reads
0 redo size
246 bytes sent via SQL*Net to client
364 bytes received via SQL*Net from client
1 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
0 rows processed
Alguns dados das estatisticas:
Coletei de várias maneiras.
exec sys.dbms_stats.gather_table_stats
(ownname='CSC_MIGRA',tabname='DFEN_CARGA_BATCH',granularity='ALL',m
ethod_opt='FOR
ALL COLUMNS SIZE 1',
estimate_percent=DBMS_STATS.AUTO_SAMPLE_SIZE,cascade=TRUE,
DEGREE=2);
analyze index CSC_MIGRA.XIE1DFEN_CARGA_BATCH compute statistics;
exec sys.dbms_stats.gather_table_stats
(ownname='CSC_MIGRA',tabname='DFEN_CARGA_BATCH',granularity='ALL',m
ethod_opt='FOR
ALL INDEXED COLUMNS SIZE 3',
estimate_percent=DBMS_STATS.AUTO_SAMPLE_SIZE,cascade=TRUE,
DEGREE=2);
Dados sobre as estatisticas coletadas:
Indices da tabela:
NAME NUM_ROWSDISTINCT
LEAF_BLOCKS
CF LEVELALFBPKEY LA
-- --- --- ---
--- --- --- ---
IX_DFEN_CARGA_BATCH 257433 257030
1108
257433 2 1 06/23/2005 11:48:18
XIE1DFEN_CARGA_BATCH257433 3
467
257433 1 155 06/23/2005 11:47:39
XIE2DFEN_CARGA_BATCH2574331514
540
257433 2 1 06/23/2005 11:48:31
XPKDFEN_CARGA_BATCH 257433 257433
656
257433 2 1 06/23/2005 11:48:26
TABLE_NAMENUM_ROWS BLOCKS AVG_ROW_LEN
SAMPLE_SIZE LA
-- --- --- ---
--- ---