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: | |
|
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 Termos do Serviço do Yahoo!.