Indices basados en funciones

Los amantes - Rene Magritte

Los amantes - Rene Magritte

Los indices basados en funciones permiten basar el indice en el resultado de una funcion SQL. Como Oracle permite crear funciones propias, los indices basados en funciones combinados con funciones creadas por un usuario, pueden transformarse en una herramienta muy poderosa.

Indices Bitmap

El grito - Edvard Munch

El grito - Edvard Munch

Los indices B-Tree almacenan rowids en las hojas del arbol. Estos indices pueden llegar a utilizar grandes cantidades de espacio de almacenamiento. A diferencia de los indices B-Tree, los indices de tipo Bitmap utilizan una fraccion de espacio mucho menor representando los rowids como valores binarios (on/off).
Los indices Bitmap son aconsejables en situaciones en que los diferentes valores que puede tomar la columna son relativamente pocos. Ejemplos: sexo, estado civil, etc. Cuantos menos valores posibles, mejor. A medida que crece la cantidad de valores posibles, aumentara el tamaño del indice.

Curiosamente este es el articulo mas leido de SqlEficiente. Evidentemente hay poca informacion en español acerca de los indices bitmap. Por dicho motivo, estare agregando algunos apendices al proyecto,  referidos a los indices bitmap.  Los links a dichos apendices se iran agregando a este articulo a medida que los vaya publicando.

Estructura de un indice bitmap

Indices de clave reversa

Escena de calle - George Grosz

Escena de calle - George Grosz

Si bien los indices B-Tree constituyen el metodo de indexacion mas comun en una base de datos Oracle, tiene sus desventajas. A veces puede ocurrir que un indice comienza a “desbalancearse” porque la mayoria de los valores “caen” del lado derecho o izuquierdo creando una estructura “desbalanceada”. Esta estructura “desbalanceada” obliga a Oracle a crear excesivos niveles de ramas provocando altas cantidades de operaciones de entrada salida para llegar a las hojas. El resultado final es una baja performance. Hay dos soluciones a este problema. El primer metodo es reconstruir el indice. El segundo metodo es utilizar indices reversos. Los indices reversos revierten el orden de los valores almacenados en el indice. Por ejemplo, si el valor de la columna es “1234”, en el indice se almacenara el valor “4321”. Esto provocara una distribucion mas “pareja” de los valores en el indice y, por ende, habra menos niveles de ramas y operaciones de entrada salida.

Indices B-Tree

Senecio - Paul Klee

Senecio - Paul Klee

El indice B-Tree es el tipo de indice mas comun en una base de datos Oracle. Es el indice default, es decir que si uno crea un indice sin especificar el tipo, Oracle lo creara de tipo B-Tree.
La estructura de un indice B-Tree tiene la forma de un arbol invertido. Las estructuras superiores se llaman ramas y la estructura inferior constituyen las hojas. Generalmente los indices B-Tree tienen uno o mas niveles de ramas. Cada rama de un nivel contiene informacion sobre otras ramas del nivel inmediatamente inferior. En el grafico podemos apreciar que la rama superior esta etiquetada con el nombre “Ingrid”. En el siguiente nivel las ramas estan divididas en las alfabeticamente “menores” a la izquierda y las “mayores” a la derecha. Por cada entrada en la tabla, el indice B-Tree registra una entrada en el indice. Cuando se ejecuta una sentencia, Oracle va recorriendo el indice desde la parte superior hasta encontrar el valor buscado. Una vez encontrado el valor buscado de acuerdo con lo requerido por la sentencia SQL, Oracle se dirigira a los datos de la tabla utilizando el rowid especificado en las hojas.
Los indices no solo constituyen un metodo para acelerar la busqueda de datos. Tambien pueden ser utilizados para forzar la unicidad de las columnas. Cuando se crea una clave primaria sobre una tabla, Oracle crea un indice unico en forma automatica para garantizar la unicidad de los valores.

Segmentos de indice

Grupo de casas en primavera - Johannes Itten

Grupo de casas en primavera - Johannes Itten

Los segmentos de indice (o indices) son objetos diseñados para incrementar la velocidad de acceso a los datos contenidos en las tablas. Un segmento de indice contiene el valor de una o mas columnas de una tabla. Ademas, un rowid (identificador de fila) es utilizado por Oracle para acceder en forma directa a los datos de una tabla. Oracle obtiene el rowid de la tabla en el indice.
Los indices no siempre constituyen la forma mas rapida de recuperar los datos de una tabla. En tablas pequeñas suele ser mas rapido acceder directamente a los datos de la tabla sin hacer uso de los indices.
Oracle provee diversos tipos de indices. Los mas utilizados son:

  • Indices B-Tree
  • Indices de clave reversa
  • Indices Bitmap
  • Indices basados en funciones

Segmentos de datos

Leopold Zborowski - Amedeo Modigliani

Leopold Zborowski - Amedeo Modigliani

Los segmentos de datos de una base de datos Oracle son las tablas. Una tabla esta compuesta por una o mas columnas donde cada columna tiene asignado un tipo de dato. En definitiva, en una base de datos Oracle, las tablas son los segmentos de la base de datos que almacenan los datos.

Segmentos

Señora de malva - Lyonel Feininger

Señora de malva - Lyonel Feininger

Hemos visto que en una base de datos Oracle, los tablespaces son los contenedores logicos que almacenan estructuras logicas. Oracle provee cuatro tipo de estructuras logicas, llamadas segmentos, que se pueden almacenar dentro de un tablespace: segmentos de datos, segmentos de indices, segmentos de undo y segmentos temporales.
Es muy importante saber que un segmento pertenece a un solo tablespace.