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!