Yuri,

Veja também em http://www.devmedia.com.br/tuning-no-oracle-parte-02/16297.
 Nota 4

"Nota 4. Seletividade de uma consulta

Podemos chamar seletividade como sendo a relação estabelecida entre a 
quantidade de linhas de uma tabela retornadas por uma consulta com a quantidade 
total de linhas da mesma tabela. É exatamente através da análise dessa 
seletividade que o Oracle decide entre usar um índice ou varrer todos os blocos 
de uma tabela. Por exemplo, imaginemos uma tabela com 1 milhão de linhas: se 
uma consulta na mesma retorna 900 mil linhas é muito mais rápido o Oracle 
varrer a tabela toda do que utilizar um índice. Apenas para termos um 
parâmetro, qualquer seletividade acima de 10% do valor total de linhas de uma 
tabela é considerada alta, e dificilmente o Oracle utilizará um índice nessa 
consulta.".





Atenciosamente,



Sérgio Chaves .




----- Mensagem original -----
De: Sérgio Luiz Rodrigues Chaves <sergio.cha...@elumini.com.br>
Para: oracle br <oracle_br@yahoogrupos.com.br>
Enviadas: Mon, 03 Feb 2014 14:26:40 -0200 (BRST)
Assunto: Re: [oracle_br] Índices no Oracle

Yuri,

É importante informar qual a sua versão de Banco de Dados. Há muitas mudança 
significativas entre elas:
"Features
Index fast full scan
Consideration of bitmap access to paths for tables with only B-tree indexes
Complex view merging
Peeking into user-defined bind variables
Index joins
Dynamic sampling
Query rewrite enables
Skip unusable indexes
Automatically compute index statistics as part of creation
Cost-based query transformations
Allow rewrites with multiple MVs and/or base tables
Adaptive cursor sharing
Use extended statistics to estimate selectivity
Use native implementation for full outer joins
Partition pruning using join filtering
Group by placement optimization
Null aware antijoins "
As 6 últimas somente no Oracle 11g.


Também é importante saber se o Banco de dados foi configurado para OLAP ou 
OLTP, visto que o otimizador e os parameters do banco são diferentes para cada 
um deles.

Verifique também se as estatísticas da tabela estão sendo coletadas.

Nos passe o plano de execução e as informações:
Selectivity = Number of rows satisfying a condition / Total number of rows
"Selectivity is the estimated proportion of a row set retrieved by a particular 
predicate or combination of predicates.
It is expressed as a value between 0.0 and 1.0:
High selectivity: Small proportion of rows
Low selectivity: Big proportion of rows
Selectivity computation:
If no statistics: Use dynamic sampling
If no histograms: Assume even distribution of rows
Statistic information:
DBA_TABLES and DBA_TAB_STATISTICS (NUM_ROWS)
DBA_TAB_COL_STATISTICS (NUM_DISTINCT, DENSITY, HIGH/LOW_VALUE,…)
"
Cardinality = Selectivity * Total number of rows

Expected number of rows retrieved by a particular operation in the execution 
plan
Vital figure to determine join, filters, and sort costs
Simple example:

SELECT days FROM courses WHERE dev_name = 'ANGEL';

The number of distinct values in DEV_NAME is 203.
The number of rows in COURSES (original cardinality) is 1018.
Selectivity = 1/203 = 4.926*e-03
Cardinality = (1/203)*1018 = 5.01 (rounded off to 6)



Att.

Sérgio Chaves.


----- Original Message -----
From: "Yuri Menon" <yuri.me...@gmail.com>
To: "oracle br" <oracle_br@yahoogrupos.com.br>
Sent: Segunda-feira, 3 de Fevereiro de 2014 13:22:14
Subject: [oracle_br] Índices no Oracle











Boa tarde pessoal!

Podem me auxiliar por favor?

A seguinte consulta:

SELECT *
FROM TMOV
WHERE CODCXA = '12345'


Retorna 3500 registros e está muito lenta.

Em conta disso, criei um índice que aponta para TMOV.CODCXA

No entanto, esse índice só é utilizado quando dou APENAS um:
SELECT CODCXA FROM TMOV WHERE CODCXA = '12345'
não é utilizado para:
SELECT * FROM TMOV WHERE CODCXA = '12345'

A minha dúvida:
É normal isso no Oracle?

Se eu quiser fazer SELECT * terei de criar um índice que "enxergue" todos os 
campos?


Obs: tentei passar com HINT pra tentar "forçar", mas não foi.

Desde já agradeço!




Responder a