Indices en 8i

Desco
12 de Septiembre del 2003
Hola Grupo,
estoy trabajando con tablas con miles y miles de datos de los cuales tengo que generar consultas de extracción y actualización, asi que decidi crear indices por cada campo utilizado para las busquedas.. pero no se.. hay que hacer algo más?. lo digo porque no encuentro diferencia.. Hay que indicar algo en las Select?, o en los Update?..
No se, ando un poco perdido en eso..
Alguien me puede ayudar..
Gracias.

nerea
12 de Septiembre del 2003
Hola,
No tienes que crear un índice por cada campo. Lo que tienes que hacer es ver la condición de aquellas selects que te tardan mucho: si la condición es por CAMPO1, CAMPO2 y CAMPO3, entonces crea un índice por CAMPO1-CAMPO2-CAMPO3.
Ten en cuenta que cuantos más índices crees más rápidas te irán las consultas pero más lentas te irán las inserciones, actualizaciones y borrados.

Desco
12 de Septiembre del 2003
Vale, entonces seria aconsejable solo mantener los indices en aquellas tablas en las que solo voy a seleccionar.. y eliminar aquellos de forma momentanea si lo que voy a realizar es una actualizacion, no?. De todas formas, con la unica creacion de los indices, ya Oracle se encarga de apuntar a los indices al realizar las consultas, no??.. No hay que hacer nada mas??. es que es la duda que me queda..
Gracias.

hernan
12 de Septiembre del 2003
Si los indices no te soluciona el problema:
Fijate, hace consultas a las vistas del diccionario de datos para ver el nivel de fragmentacion que tiene la tabla, y puede ser que tendrias que defragmentar la tabla o aumentar el tamaño de los extends (chequea la clausula storage del tablespace donde esta la tabla)


Carlos
12 de Septiembre del 2003
O también puedes analizar las tablas. Si tienes muchos registros suele ser efectivo. Prueba con esta sentencia:
ANALYZE TABLE TABLE_NAME COMPUTE STATISTICS

Adrian
12 de Septiembre del 2003
La creación de un índice no garantiza que este vaya a ser utilizado.

Si indexas una columna con muchos valores iguales, el optimizador puede
decidir prescindir del índice, porque cuesta menos leer todos los
registros de la tabla que leer el índice para ver qué filas tiene que y
luego leer la tabla para recuperar los datos de esas filas.

Si usas una función en tu select, el índice no será utilizado. Por
ejemplo: SELECT * FROM MI_TABLA WHERE UPPER(NOMBRE) = 'GUSTAVO' nunca
usará el índice, a no ser que indexes usando una función: CREATE INDEX
MI_INDICE ON MI_TABLA(UPPER(NOMBRE)), en cuyo caso sólo acelerará las
búsquedas por UPPER(NOMBRE).

Lo mismo para con el LIKE: SELECT * FROM MI_TABLA WHERE NOMBRE LIKE
'%PEREZ%' prescindirá del índice en la columna NOMBRE.

Si creas un índice agrupado (CAMPO1 + CAMPO2 + CAMPO3), en tu select debes buscar al menos por CAMPO1, o CAMPO1 + CAMPO2.

Además, es vital que las estadísticas de todos las tablas e índices
(menos las del esquema SYS) se actualizen regularmente. Usa el paquete incorporado DBMS_STATS para esto.

Eliminar índices "de forma momentanea", como sugieres en un mensaje anterior,
sería desastroso para el rendimiento.

Saludos