Está en la página 1de 6

U2.

Índices

Un índice es una lista de referencias a objetos.


• Funciona de manera similar al de un libro de texto.
• Permite acceder a los registros de un archivo sin necesidad de recorrerlos
secuencialmente.

Tipos de índices
• Ordenados: los valores que se almacenan en el índice están siempre ordenados.
• Índices asociativos: los valores del índice se almacenan en una serie de cajones
o buckets, según el valor asignado por una función llamada función de Hash.

Índices
Características de los índices
• Tipo de acceso (valor único o rango de valores)
• Tiempo de acceso
• Tiempo de inserción
• Tiempo de borrado
• Espacio AdicionalU2. Índices Ordenados
• Se utilizan para permitir un acceso aleatorio rápido a los registros de un
archivo.
• Cada estructura de índice está asociada con una clave de búsqueda.
• El índice ordenado almacena las claves de búsqueda de manera ordenada y junto con
cada clave una referencia al registro donde se encuentra.
• Para un mismo archivo de registros pueden existir más de un índice, dependiendo
de la clave de búsqueda.

Tipos de índices ordenados


• Índice primario. Es un índice cuya clave de búsqueda especifica el orden
secuencial del archivo de registro. También se los llama clustering index.
• Índice secundario. Es un índice cuya clave de búsqueda difiere del orden
secuencial del archivo de registros.

Ejemplo
Dado el siguiente archivo de registros.
Está este archivo ordenado por alguna clave de búsqueda?

Índice denso
El siguiente índice es primario porque la clave de búsqueda coincide con el
ordenamiento secuencial del archivo.
Además es un indice denso porque en el índice existe una entrada para cada clave de
búsqueda del archivo de registros.

Ejemplo
• Dado un archivo de datos con 1.000.000 de registros, ordenados por una clave de
búsqueda.
• En un bloque entran 5 registros.
• ¿Cuantos accesos a disco máximos son necesarios para acceder a un registro random
por su clave de búsqueda, utilizando...
• acceso secuencial?
• búsquedas binaria? Nota: recordar que si una colección tiene b elementos, se
requieren como máximo Log2(b) accesos para alcanzar cualquier elemento usando
búsqueda binaria.
• Definiendo un índice denso para el archivo, utilizando la clave de búsqueda.
• En un bloque entran 500 entradas del índice.
• ¿Cuantos accesos a disco son necesarios para acceder a un registro random por su
clave de búsqueda, utilizando búsqueda binaria sobre el índice denso?
• ¿Conclusiones?
Índice disperso
El siguiente es un índice disperso, porque aparecen en el índice solamente alguna
de las claves de búsqueda del archivo de registros

Índices primario disperso

Preguntas
Puede definirse un índice disperso utilizando una clave de búsqueda que no sea la
que define la secuencialidad del archivo?
Puede definirse un índice denso utilizando una clave de búsqueda que no sea la que
define la secuencialidad del archivo?
Cuando utilizaría un índice denso y cuando uno disperso?

Índices multinivel
Qué ocurre si el archivo de datos tiene muchos registros, digamos, 100.000.000?
• Suponiendo que 100 entradas de un índice denso entran en un bloque de 4KB, el
índice completo ocuparía... 1.000.000 de bloques o sea 4GB de espacio en disco!
• Utilizando búsqueda binaria para encontrar elemento requeriría la siguiente
cantidad de lectura de bloques: Log2 (1.000.000) = 20
• Asumiendo 10ms de tiempo de lectura por bloque, se obtienen 200ms de demora para
encontrar un registro en el índice.

Se utiliza un índice exterior disperso donde se almacena clave y bloque del índice
interior donde se encuentra. Existe una entrada en el índice exterior por cada
bloque del índice interior.
Es conveniente que el índice exterior se almacene en memoria RAM.
El índice interior puede ser denso o disperso se utiliza para acceder a los bloques
con los registros.
¿Cuántos accesos son necesarios para resolver el problema anterior suponiendo:
• El índice exterior entra en memoria RAM y cada bloque del indice exterior
contiene 100 referencias a bloques del índice interior.
• El índice interior es denso.
¿Qué ocurre si el índice exterior no puede almacenarse en memoria RAM?

Índice secundario.
Es un índice cuya clave de búsqueda difiere del orden secuencial del archivo de
registros.
• Necesariamente debe ser denso.
• Cada entrada posee la clave de búsqueda y las referencias a cada bloque donde se
encuentre un registro con la clave especificada. En general se implementa haciendo
referencias a buckets, en los cuales se encuentran las referencias a los bloques
donde se encuentran los registros.
Índice Secundario Buckets Archivo de registros
¿Qué ocurre si se llena un bucket con referencias a registros?

Inconvenientes de los índices ordenados


• Al tener diseño secuencial, su performance se reduce al crecer los índices y los
archivos de datos.
• Si bien los Inconvenientes puede mejorarse con la reordenación periódica de los
archivos esta actividad no es deseable.U2. Árboles B+
• El árbol B+ (balanceado) la estructura de datos más ampliamente usada para
implementar índices en base de datos.
• Su característica principal es que mantiene la performance a medida que la base
de datos crece.

Características
• El camino de desde la raíz a las hojas tiene siempre la misma longitud.
• Es un índice multinivel no secuencial.
• Cada nodo posee :
• n-1 claves de búsqueda K (ordenadas dentro del nodo)
• n punteros
• Cada nodo debe tener ocupados al menos n/2 punteros (excepto el nodo raíz)

Ejemplo de un árbol con n=4, sobre el archivo de profesores, utilizando la clave de


búsqueda nombre del profesor.

Árboles B+
Ejemplo
• Dado el archivo de datos con 1.000.000 de registros, ordenados por una clave de
búsqueda del ejemplo anterior. Suponemos que la clave de búsqueda es única.
• En un bloque entran 5 registros.
• ¿Cuantos accesos a disco máximos son necesarios para acceder a un registro random
por su clave de búsqueda, utilizando un índice implementado en árbol B+ donde cada
nodo se implementa en un bloque. Entran 100 punteros del árbol en cada bloque.
Nota: recordar que si una colección tiene b elementos, se requieren Log n/2 (b)
accesos máximos para alcanzar cualquier elemento usando un árbol B+ de orden n.
Además recordar que Log n (b) = log(b) / log(n)
• Comparar los resultados obtenidos utilizando un árbol B+ con los resultados
obtenidos utilizando el índice secuencial denso.
• ¿Existe algún caso en el cual el índice secuencial denso requiere menos accesos a
disco que el árbol B+ para arrojar un resultado, dada una clave de búsqueda?
Actualización del árbol B+

Inserción
• Para insertar una clave debe buscarse el nodo hoja donde debe estar y agregarlo.
• Al insertar una clave en el árbol B+ debe considerarse la posibilidad de que el
nodo deba separarse en dos por superar su capacidad máxima.

Eliminación
• Para eliminar una clave debe buscarse el nodo hoja donde se encuentra y
eliminarlo.
• Al eliminar una clave del árbol debe considerarse la posibilidad de que se unan
dos nodos por lo alcanzar su Ocupación mínima.U2. Árboles B+

Eliminar entrada con clave de búsqueda no únicas


Si se utiliza un índice para una clave no única, existe una entrada en un nodo hoja
por cada registro con dicha clave. ¿Qué impacto tiene esto cuando se elimina un
registro?
• Una solución es convertir la clave no única en única combinándola con un atributo
"unificador" (uniquifier)
• Otra solución es guardar la clave solo una vez y en el puntero guardar una
referencia a un bucket donde se encuentran las referencias a los registros.U2.
Árboles B+

Costo de actualizar un Árbol B+

Inserción
La cantidad de operaciones de I/O máximas para actualizar el árbol cuando se
realiza una inserción es: Log n/2 (N)
Donde N es la cantidad de registros y n es la cantidad máxima de punteros en los
nodos.

Eliminación
La cantidad de operaciones de I/O máximas para actualizar el árbol cuando se
realiza una eliminación es: Log n/2 (N)
Donde N es la cantidad de registros y n es la cantidad máxima de punteros en los
nodos.
Esta fórmula considera que las claves de búsqueda son únicas.
¿Qué ocurre con las modificaciones?

Diferencias con el árbol B


• No existen claves duplicadas en el árbol.
• Los nodos no hoja poseen un puntero a nodos del siguiente nivel y un puntero
adicional al registro.
• Un inconveniente de la organización de archivos secuenciales es que hay que
acceder a una estructura de índices para localizar los datos.
• La organización de archivos basada en la técnica de asociación (hashing) permite
evitar el acceso a la estructura de índice. La asociación también proporciona una
forma de construir índices.

Organización de archivos por asociación


• En una organización de archivo por asociación se obtiene la dirección del bloque
de disco que contiene el registro deseado mediante el calculo directo de una
función sobre el valor de la clave de búsqueda del registro.
• En nuestros términos, utilizaremos bucket (cajón) par a referirnos a una unidad
de almacenamiento que puede guardar uno o mas registros. Un bucket es normalmente
un bloque de disco.
• Si la clave de búsqueda es Ki, al aplicarle la función hash h resulta: h(Ki) =
Bucket con el registro i
• La peor función de asociación h() posible es la que asigna todos los valores de
la clave de búsqueda al mismo cajón ¿Por qué?
• En el otro extremo, otra función no deseable seria la que asigna a cada clave de
búsqueda una dirección diferente ¿Por qué?

Características desables de las funciones de hash


• Distribución uniforme: cada bucket tiene asignado el mismo número de valores de
la clave de búsqueda dentro del conjunto de todos los valores posibles de la clave
de búsqueda.
• Distribución aleatoria: en el caso medio, cada bucket tendrá casi el mismo número
de valores asignados a él. U2. Funciones de asociación (hash)

Ejemplos
• Se decide tener 26 cajones y se define una función de asociación que asigna a las
claves de búsqueda alfabéticas que empiezan con la letra i-esima del alfabeto al
i#esimo bucket. ¿Está función cumple con las características deseadas?
• Ahora, supongamos que se quiere una función de asociación en la clave de búsqueda
saldo. Supongamos que el saldo mínimo es 1 y el máximo es 20.000.000.
Definimos una función de asociación que divide los valores posibles en 10 rangos
(se utilizaran 10 cajones). ¿Está función cumple con las características deseadas?

Conclusiones
• Las funciones de asociación típicas, realizan cálculos sobre la representación
binaria interna de la maquina para los caracteres de la clave de búsqueda.
• Una función bien diseñada en un caso medio de búsqueda toma un tiempo constante
(pequeño), independientemente del numero de claves del archivo.

Desbordamiento de buckets
¿Qué ocurre si luego de aplicar una función de hash no hay lugar suficiente para
almacenar el registro en el bucket?
Ocurre un desbordamiento de buckets

Posible Solución

Mantener una lista enlazada con buckets de desbordamiento.U2. Indices asociativos


(Hash Index)
• Un índice asociativo (hash index) organiza las claves de búsqueda, con sus
punteros asociados, dentro de una estructura de archivo asociativo.
¿Cómo se usa?
• Aplicando una función de hash sobre la clave de búsqueda para identificar un
bucket dentro del índice.
• Almacenando las claves y los punteros asociados en el bucket del índice (o en los
buckets de desbordamiento).

Ejemplo
• Archivo cuenta bancaria.
• Clave código de cuenta.
• El índice asociativo tiene 7 cajones, cada uno de tamaño para dos registros.
• La función de hash utilizada calcula la suma de los dígitos del número de cuenta
módulo 7.
En este ejemplo, la función de hash h() siempre apunta a un número fijo de Buckets.
Esto se conoce como asociación estática.

Si se va a utilizar la asociación estática para bases de datos que crecen en el


tiempo, tenemos 3 clases de opciones.
1. Elegir una función de asociación basada en el tamaño actual del archivo.
2. Elegir una función de asociación basada en el tamaño previsto del archivo con
relación a un punto determinado del futuro.
3. Reorganizar periódicamente la estructura asociativa en respuesta al crecimiento
del archivo.
¿Qué inconvenientes tiene cada opción?

Indices asociativos dinámicos


Los índices asociativos dinámicos permiten modificar la función de hash
dinámicamente para acomodarse al aumento o disminución de la base de datos.

Asociación extensible
• Es un tipo particular de asociación dinámica.
• Hace frente a los cambios del tamaño de la base de datos, separando y uniendo
buckets a medida que la base de datos aumenta o disminuye.
• La organización se realiza sobre un bucket cada vez, entonces la degradación del
rendimiento resultante es aceptable.

Indices asociativos

Búsqueda en asociación extensible

• Se define una función de hash h() aleatoria y uniforme, que dé como resultado un
número de salida amplio de b bits (típicamente b=32bits)
• No se crea un bucket para cada valor de la función de hash.
• Se comienzan utilizando los i bits más significativos (0 <= i <= b)
• Los bits se utilizan en una tabla de direcciones de buckets

Asociación extensible

Búsqueda en asociación extensible


• Para localizar el bucket que contiene el valor de la clave de búsqueda K, se
toman los primeros i bits mas significativos de h(K), se busca la entrada en la
tabla de direcciones que corresponda a esa cadena de bits y se sigue el puntero del
bucket.

Inserción en asociación extensible


• Para insertar un registro con un valor de la clave de búsqueda K, se sigue el
mismo procedimiento de búsqueda que antes, llegando a algún bucket j. Si hay sitio
en el bucket se inserta el registro en el.
• Bucket . Si por el contrario el bucket esta lleno, hay que dividir el bucket y
redistribuir los registros actuales mas uno nuevo.

También podría gustarte