Problemas con Querys e Indices

Hola Experto:
Nuevamente necesito de tus consejos. Tengo una página web que realiza consultas a una base de datos oracle 8i. Pero, cuando ejecuta la Query correspondiente el Oracle no está ocupando los índices que están creados. Tengo una replica de las tablas en mi equipo con los mismos datos, indices y objetos asociados. Al realizar la misma consulta, el Oracle si ocupa los índices que están creados.
Obviamente el tiempo de respuesta en mi equipo es mucho menor que en la base de datos oficial. ¿Por qué sucede esto?,¿De qué manera puedo lograr que el Oracle ocupé los índices?
Respuesta
1
Esto puede pasar por varios motivos, el primero, que los indices no estén reconstruidos, prueba a reconstruirlos con la sentencia:
sql> ALter index index_name rebuild;
Otra razón puede ser que no analices las tablas, si no lo haces para el optimizador es como si las tablas estuvieran con el número de filas de su ultimo análisis, me explico, creas una tabla y le insertas 100 registros, le creas un indice y la analizas, para Oracle es más fácil recuperar la tabla entera que un indice para 100 registros, por tanto, ignora el indice. Mañana añades 100.000 registros, pero no analizas la tabla, entonces para Oracle es como si siguiera teniendo 100 registros, por tanto ignora el indice.
SI no analizas periódicamente la base de datos puedes llevarte disgustos de estos.
Si no lo haces y no sabes como entra en Otn. Oracle.com y busca por CBO Statistics y encontraras un documento en el que te explica como funciona y los scripts para ponerlo en marcha.
Por ejemplo:
DBMS_STATS.GATHER_DATABASE_STATS(ESTIMATE_PERCENT=>40,
CASCADE=>TRUE);
Esto clacula las estadísticas tomando un porcentaje de muestra del 40% (suficiente). Con esta sentencia puedes crear un job que se ejecute una vez a la semana y listo.
P.D: Si lo haces con esta sentencia y no esquema a esquema o solo el esquema que te interese, por un bug de Oracle debes borrar luego las estadísticas del sys, sino el rendimiento cae, es decir después de calcular las estadísticas creas otro job que borre las del sys de la forma:
DBMS_UTILITY.ANALYZE_SCHEMA('SYS','DELETE');
Saludos y si no te funciona avisa.
Muchas Gracias experto. Perdona la demora de la respuesta, pero para no dar más vueltas voy a cerrar la pregunta, probar junto con mi DBA y si no me resulta te pido nuevamente ayuda. Muchas Gracias.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas