Francisco,

Por acaso a sua query está usando alguma função (trunc, to_char, substr,
etc) que está invalidando o índice ?

Verifique se o seu índice tem chave composta e se vc está fornecendo os
atributos necessários para a pesquisa por data, por exemplo:

Execute o sql abaixo (ve_ind):
-----------------------------------------------
break on NOMEINDEX
set linesize 100
set verify off;
column NOMECOLUNA format a30;
select UI.index_name                NOMEINDEX,
       UI.uniqueness                UNICIDADE,
       AIC.column_position          POSICAO  ,
       SUBSTR(AIC.column_name,1,30) NOMECOLUNA
from   user_indexes UI, all_ind_columns AIC
where  UI.table_name     = LTRIM(RTRIM(upper('&tabela')))
and    AIC.table_name  = UI.table_name
and    AIC.index_owner = UI.table_owner
and    AIC.index_name  = UI.index_name
order  by UI.index_name, AIC.column_position;
-----------------------------------------------

DBTESTE:SQL> @ve_ind
Informe o valor para tabela: ca_log_ultimo

NOMEINDEX                      UNICIDADE    POSICAO NOMECOLUNA
------------------------------ --------- ---------- --------------
I_ETD_ID_LOG_ULTIMO            NONUNIQUE          1 ETD_ID
I_PAL_ID_LOG_ULTIMO            NONUNIQUE          1 PAL_ID
I_VTR_ID_LOG_ULTIMO            NONUNIQUE          1 VTR_ID
PK_CA_LOG_ULTIMO               UNIQUE             1 ID
UK_CA_LOG_ULTIMO               UNIQUE             1 CLI_ID
                               UNIQUE             2 TP_PRODUTO

Observe que UK_CA_LOG_ULTIMO é uma chave composta por dois atributos. Se no
WHERE de um sql estivesse referenciando apenas o atributo CLI_ID, esta
pesquisa usaria o índice UK_CA_LOG_ULTIMO, porém se o sql referenciasse
apenas TP_PRODUTO, a pesquisa seria FULL SCAN.

Para o caso de vc estar com o where para o índice certo, NÃO usando funções
que invalidam o índice e mesmo assim o sql não usa o índice, procure ver se
esta tabela está com as estatísticas em dia, se estiver, o problema é no
sql.

Para este caso, eu uso a função STAR_TRANSFORMATION  para testar:

select --+ STAR_TRANSFORMATION
  a.nr_produto                               NR_PRODUTO,
  a.nr_interno                               NR_INTERNO,
  a.dt_validacao                              DT_ULT_VALID
..........

Com ela, o parse vai "ajeitar" o seu sql para melhorar a performance (mas
ele tb não faz milagres), mas sempre ajuda. O problema é que até hoje eu não
consegui pegar o sql que ele melhorou e mandou para o banco ...

------------------------------------------

Veja um exemplo real:

audidw:SQL> @ve_ind
Informe o valor para tabela: SIM_UTILIZACAO_DIARIA_CARTAO

NOMEINDEX                      UNICIDADE    POSICAO NOMECOLUNA
------------------------------ --------- ---------- -------------
SUD_SUD2_UK                    NONUNIQUE          1 NR_PRODUTO
                               NONUNIQUE          2 NR_INTERNO
                               NONUNIQUE          3 DT_VALIDACAO

audidw:SQL> select count(*) from SIM_UTILIZACAO_DIARIA_CARTAO;

  COUNT(*)
----------
  69733890 (<== quase SETENTA MILHÕES DE LINHAS...)


audidw:SQL> edit
Gravou arquivo afiedt.buf
  1  select a.nr_produto      NR_PRODUTO,
  2         a.nr_interno      NR_INTERNO,
  3      a.dt_validacao     DT_ULT_VALID,
  4      a.qt_validacoes      QT_VALID_ACUM_DESDE_ULT_COMPR
  5  from sim_utilizacao_diaria_cartao a
  6  where a.nr_produto= 202 and a.dt_validacao = '15/05/06'
  7* and nr_interno = 1178156
audidw:SQL> /

NR_PRODUTO NR_INTERNO DT_ULT_V QT_VALID_ACUM_DESDE_ULT_COMPR
---------- ---------- -------- -----------------------------
       202    1178156 15/05/06                             4

Decorrido: 00:00:27.08 <<<=== Vinte e Sete segundos

Plano de Execução
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   TABLE ACCESS (FULL) OF 'SIM_UTILIZACAO_DIARIA_CARTAO'
Estatística
----------------------------------------------------------
          1  recursive calls
          1  db block gets
     242514  consistent gets
     241665  physical reads
      46440  redo size
        602  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed



===> o mesmo SQL, porém usando a STAR_TRANSFORMATION:

audidw:SQL> edit
Gravou arquivo afiedt.buf

  1  select --+ STAR_TRANSFORMATION
  2         a.nr_produto      NR_PRODUTO,
  3         a.nr_interno      NR_INTERNO,
  4      a.dt_validacao     DT_ULT_VALID,
  5      a.qt_validacoes      QT_VALID_ACUM_DESDE_ULT_COMPR
  6  from sim_utilizacao_diaria_cartao a
  7  where a.nr_produto= 202 and a.dt_validacao = '15/05/06'
  8* and nr_interno = 1178156
audidw:SQL> /

NR_PRODUTO NR_INTERNO DT_ULT_V QT_VALID_ACUM_DESDE_ULT_COMPR
---------- ---------- -------- -----------------------------
       202    1178156 15/05/06                             4

Decorrido: 00:00:00.04


<<<<==== SHOW DE BOLA .............
<<<<==== APENAS **QUATRO DÉCIMOS** DE SEGUNDOS contra 27segs do sql anterior


Plano de Execução
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=9 Card=20 Bytes=960)
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'SIM_UTILIZACAO_DIARIA_CA
          RTAO' (Cost=9 Card=20 Bytes=960)
   2    1     BITMAP CONVERSION (TO ROWIDS)
   3    2       BITMAP INDEX (SINGLE VALUE) OF 'SUD_SUD2_UK'
Estatística
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          8  consistent gets
          2  physical reads
         60  redo size
        602  bytes sent via SQL*Net to client
        503  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed



Ederson Elias de Oliveira
DBA Oracle
Setransp - Goiânia-GO
-------------------------------------------------------------------

-----Mensagem original-----
De: oracle_br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED] Em
nome de Francisco Garcia
Enviada em: quinta-feira, 25 de maio de 2006 10:31
Para: oracle_br@yahoogrupos.com.br
Assunto: [oracle_br] Forçar o índice

Bom dia, pessoal.
Tenho uma tabela que contem um índice por data. MAs ao
executar uma query , não está utilizando esse índice.
Utilizei o analize e deu full table scan. Tem algum
jeito de reativar o índice ou de forçar a sua
utilização?

Obrigado




--------------------------------------------------------------------------------------------------------------------------
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/
--------------------------------------------------------------------------------------------------------------------------__________________________________________________________________

Este Grupo recebe o apoio da SQL Magazine - www.devmedia.com.br/sqlmagazine
__________________________________________________________________
O grupo Oracle_br não aceita anexos. Quando oferecer algum arquivo, tenha o link do mesmo para evitar trafego(pedidos) desnecessário.



Yahoo! Grupos, um serviço oferecido por:
PUBLICIDADE


Links do Yahoo! Grupos

Responder a