Buscar este blog

domingo, 17 de julio de 2011

Indices

Un índice es una estructura diseñada para obtener un acceso más rápido a los datos contenidos dentro de una tabla.

Un índice es independiente de los datos almacenados en la tabla y cuando se encuentra bien definido, es decir, cuando se forma atendiendo a la gran mayoría de las consultas que se harán sobre una tabla, reduce significativamente la búsqueda, aumentando el rendimiento.

Inmediatamente luego de creado el índice, Oracle comienza a mantenerlo de acuerdo a las inserciones, actualizaciones y eliminaciones de registros de la tabla en la cual se ha implementado.

Tipos de índices

Existen tres tipos de índices cuya naturaleza depende de la forma en que haya sido creado. Estos tipos son:

  • Un índice único es aquel que tiene la restricción adicional de que el grupo de columnas indexadas define una única fila. Sin embargo, si no van a existir más grupos de columnas con esta características dentro de una misma tabla, se recomienda crear el conjunto como una clave primaria ya que de todas formas Oracle asociará un índice único a esta restricción (la clave primaria).
  • Un índice no único, que es aquel que no impone la restricción de que las filas no deban repetirse.
  • Un índice compuesto es aquel que agrupa varias columnas de la tabla. Este tipo es muy útil cuando las sentencias de selección (SELECT) efectúan búsquedas por varios criterios (columnas) en una misma tabla. Es importante el orden en que se ponen las columnas al crear el índice; la columna más referenciada debería ser puesta en primer lugar y así sucesivamente.

Cuando se crea un índice (de cualquier tipo) también se crea un segmento de datos para guardar esa información, que también se verá afectada por la misma cláusula storage que se estudió para el caso de las tablas.

Consideraciones en el diseño de índices

Un índice sólo es efectivo cuando es utilizado. Es por eso que debe asegurarse que la frecuencia de uso sea muy alta y que su implementación redunde en mejoras de rendimiento de las consultas efectuadas a la tabla donde reside el índice. Sin embargo, no debe explotarse el uso de los índices dentro de una misma tabla porque con cada operación de inserción, actualización o eliminación que se lleva a cabo sobre una tabla, sus índices se deben recrear, con el consiguiente overhead que se produce. A menudo es conveniente eliminar o desactivar temporalmente un índice cuando sabemos que se va a efectuar una operación de carga/actualización/eliminación masiva en la tabla para evitar este overhead y más tarde volver a crearlo, cuando la operación haya finalizado.

Considere las siguientes reglas de indexación para cuando se enfrente a la tarea de decidir qué tablas indexar:

  • Indexe solamente las tablas cuando las consultas (queries) no accedan a una gran cantidad de filas de la tabla. Use índices cuando una query acceda a un porcentaje menor al 5% de las filas de una tabla.
  • No indexe tablas que son actualizadas con mucha frecuencia.
  • Indexe aquellas tablas que no tengan muchos valores repetidos en las columnas escogidas. Recuerde que finalmente el índice hace una búsqueda secuencial dentro de un conjunto de filas objetivo.
  • Las queries muy complejas (en la cláusula WHERE) por lo general no toman mucha ventaja de los índices. Cuando posea más experiencia podrá corroborar esta afirmación y estará preparado para arreglar estas situaciones.

También es importante decidir qué columnas indexar. Siga las siguientes reglas cuando tenga que tomar esta decisión:

  • Escoja las columnas que se utilizan con mayor frecuencia en las cláusulas WHERE de las consultas.
  • No indexe aquellas columnas que tengan demasiados valores repetidos en ellas.
  • Las columnas que toman valores únicos son excelentes candidatas para indexar. Oracle automáticamente indexa las claves primarias de las tablas.
  • Indexe las columnas que sirven para unir una tabla con otras (join en las consultas).
  • Si hay columnas que no tienen valores únicos por sí solas pero que en conjunto con otra columna forman una dupla única o con pocas repeticiones (menos que las columnas individualmente), entonces conviene indexarlas (siempre y cuando existan consultas que las utilicen en conjunto). Estos índices reciben el nombre de índices compuestos.

Sintaxis de creación de índices:

CREATE INDEX nombre_indice ON [esquema.]nombre_tabla (columna1 [, columna2, ...])

TABLESPACE nombre_tablespace ;

Indices particionados

Tal como en el caso de las tablas, los índices también pueden ser almacenados en tablespaces separados. La sintaxis de creación de los índices de este tipo es similar a la de creación de las tablas particionadas:

CREATE INDEX nombre_indice ON [esquema.]nombre_tabla (columna1 [, columna2, ...])

PARTITION BY RANGE (columna1 [, columna2, ...])

PARTITION particion1 VALUES LESS THAN (valor) TABLESPACE tablespace1

[PARTITION particion2 VALUES LESS THAN (MAXVALUE) TABLESPACE tablespace2)] ;

Observe que el valor representado por la palabra reservada MAXVALUE será siempre el mayor valor presente en la tabla para la columna especificada.

Secuencias

A menudo es preciso generar números en forma ordenada para implementar, por ejemplo, una clave primaria en una tabla o garantizar que esos números no se repiten y van siempre en un orden predefinido por el desarrollador (no necesariamente secuenciales).

La forma tradicional de efectuar lo anterior sería almacenar el último número utilizado en un registro especial, bloquearlo, obtener el próximo valor, actualizar el registro, desbloquearlo y utilizar el número. Sin embargo, para eso Oracle implementa los objetos denominadas secuencias, que permiten hacer lo anterior de manera transparente para el usuario.

Cuando se define una secuencia se deben indicar, como mínimo, el valor de partida (valor mínimo) y el incremento.

La sintaxis de creación de una secuencia es la siguiente:

CREATE SEQUENCE nombre_secuencia

INCREMENT BY número

START WITH número

MINVALUE número [o NOMINVALUE]

MAXVALUE número [o NOMAXVALUE]

NOCYCLE [o CYCLE] ;

Los parámetros significan lo siguiente:

  • Increment by: Indica la cantidad de incremento de la secuencia.
  • Start with: Es el valor de partida de la secuencia.
  • Minvalue: Indica cuál será el valor mínimo de la secuencia.
  • Maxvalue: Corresponde al valor máximo que puede tomar la secuencia.
  • Nocycle: Es el valor por defecto para establecer si la secuencia deberá comenzar nuevamente a generar valores una vez que ha alcanzado el máximo.

No hay comentarios:

Publicar un comentario