RES: [oracle_br] DBMS_STATS

2005-06-24 Por tôpico Rosiano Vieira de Sales
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',method_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',method_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  2570301108
 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
-- --- --- ---
--- ---
DFEN_CARGA_BATCH257433  2656355842
 257433 06/23/2005 11:47:27

SQL @colstats dfen_carga_batch

COLUMN_NAMENUM_DISTINCT   NUM_NULLS NUM_BUCKETS DENSITY
--  --- --- ---
COD_CHAVE255995   0   3 ,039279
COD_CHAVE_ANT  2969  254464   1 ,0003368137
COD_LOJA  5   0   3  ,2
COD_LOJA_ORIGINAL   492   0   1 ,0020325203
COD_LOTE   1514   0   3  ,000660502
COD_PRODUTO  11   0   1 ,0909090909
NUM_SEQ_REGISTRO   4506   0   3 ,0002219263
STRING_CARTAO 0  257433   1   0
STRING_CLI_BASE  164894   0   1 ,060645
STRING_CLI_CONJUGE7   0   1 ,1428571429
STRING_CLI_EMPREGO   182749   0   1 5,47199E-06

Re: RES: [oracle_br] DBMS_STATS

2005-06-24 Por tôpico jlchiappa
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
 -- --- --- ---
 --- ---