Saltar al contenido

Forzar el uso del índice en Oracle

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *