Luego de consultar expertos en la materia, programadores de varias ramas y maestros hemos dado con la solución al dilema y la dejamos plasmada en esta publicación.
Solución:
Puedes usar sugerencias del optimizador
select /*+ INDEX(table_name index_name) */ from table
etc…
Más información sobre el uso de sugerencias del optimizador: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm
Podría haber muchas razones para el índice que no se está utilizando. Incluso después de ti especificar sugerenciashay posibilidades de que el optimizador de Oracle piense lo contrario y decide no usar Index. Debe pasar por la parte EXPLICAR PLAN y ver cuál es el costo de la declaración con ÍNDICE y sin ÍNDICE.
Asumiendo que Oracle usa CBO. La mayoría de las veces, si el optimizador piensa que el costo es alto con INDEX, aunque lo especifique en las sugerencias, el optimizador lo ignorará y continuará con el escaneo completo de la tabla. Su primera acción debe ser verificar DBA_INDEXES para saber cuándo las estadísticas son LAST_ANALYZED. Si no se analiza, puede configurar la tabla, el índice para analizar.
begin
DBMS_STATS.GATHER_INDEX_STATS ( OWNNAME=>user
, INDNAME=>IndexName);
end;
para mesa
begin
DBMS_STATS.GATHER_TABLE_STATS ( OWNNAME=>user
, TABNAME=>TableName);
end;
En casos extremos, puede intentar configurar las estadísticas por su cuenta.
Si cree que el rendimiento de la consulta será mejor utilizando el índice, ¿cómo podría obligar a la consulta a utilizar el índice?
Primero, por supuesto, verificaría que el índice diera un mejor resultado para devolver el conjunto de datos completo, ¿verdad?
La pista índice es la key aquí, pero la forma más actualizada de especificarlo es con el método de nomenclatura de columnas en lugar del método de nomenclatura de índices. En tu caso usarías:
select /*+ index(table_name (column_having_index)) */ *
from table_name
where column_having_index="some value";
En casos más complejos, es posible que…
select /*+ index(t (t.column_having_index)) */ *
from my_owner.table_name t,
...
where t.column_having_index="some value";
Con respecto a los índices compuestos, no estoy seguro de que usted necesitar para especificar todas las columnas, pero parece una buena idea. Consulte los documentos aquí http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements006.htm#autoId18 sobre múltiples index_specs y el uso de index_combine para múltiples índices, y aquí http://docs.oracle. com/cd/E11882_01/server.112/e26088/sql_elements006.htm#BABGFHCH para la especificación de varias columnas en index_spec.
Recuerda que tienes el privilegio parafrasear si te fue de ayuda.