Vous êtes sur la page 1sur 9

Tema 8. Indexacin y asociatividad (hashing).

Tema 8.Indexacin y asociatividad (hashing).


Muchas consultas hacen referencia a slo una pequea parte de los registros de un archivo. Es ineficiente que el
sistema tenga que leer todos los registros. Lo ideal es que el sistema pueda localizar directamente estos registros. Para
permitir estas formas de acceso diseamos estructuras adicionales que asociamos con archivos. Consideraremos dos
formas generales de atacar ste problema: la construccin de ndices y la construccin de funciones de asociatividad
(hash).

8.1. Conceptos bsicos.


Un ndice de un archivo funciona de manera similar a un catlogo en una biblioteca. Si estamos buscando un
libro por un autor determinado, buscamos en autores y una tarjeta de catlogo nos dice dnde encontrar el libro. Para
facilitarnos la bsqueda, las tarjetas se guardan en orden alfabtico, de forma que no tenemos que comprobar todas para
encontrar la que queremos.
En las BD es posible que estos tipos de ndices sean demasiado grandes para manejarse eficientemente. En vez
de ello, pueden utilizarse tcnicas de indexacin ms sofisticadas. Como alternativa a la indexacin se utilizan funciones
de asociatividad. Consideraremos varias tcnicas tanto de asociatividad como de indexacin. Ninguna de ellas es la
mejor, sino que cada una es ms apropiada para una aplicacin especfica de BD. Cada tcnica debe evaluarse en base a:
n Tiempo de acceso. El tiempo que se tarda en encontrar un dato determinado.
n Tiempo de insercin. El tiempo que se tarda en insertar un dato nuevo. Esto incluye el tiempo que se tarda
en encontrar el lugar correcto, as como el que se tarda en actualizar la estructura de indexacin.
n Tiempo de eliminacin. El tiempo que se tarda en eliminar un dato. Esto incluye el tiempo que se tarda en
encontrar el dato, as como el que se tarda en actualizar la estructura de indexacin.
n Espacio extra. El espacio adicional que ocupa la estructura de indexacin. Siempre que este espacio no sea
muy grande, merece la pena sacrificar el espacio por una mejora en el rendimiento.
Muchas veces queremos tener ms de un ndice o funcin de aosciatividad para un archivo. El atributo o
conjunto de atributos que se usa para buscar registros en un archivo se llama clave de bsqueda.. Obsrvese que sta
definicin de clave difiere de las de clave primaria, clave candidata y superclave.

8.2. Indexacin.
Para pemitir el acceso aleatorio rpido a los registros de un archivo se utiliza una estructura de ndice. Cada
estructura de ndice est asociada con una clave de bsqueda determinada. Si el archivo est ordenado secuencialmente y
elegimos incluir varios ndices en diferentes claves de busqueda, el ndice cuya clave de bsqueda especifca el orden
secuencial del archivo es el ndice primario. Los dems se llaman ndices secundarios. La clave de bsqueda de un
ndice primario es normalmente la clave primaria.
En esta seccin suponemos que todos los archivos estn ordenados secuencialmente y , por tanto, tienen una
clave de bsqueda primaria. Dichos archivos, junto con un ndice primario, se llaman archivos de ndices secuenciales.
Se encuentran entre los esquemas de indexacin ms antiguos usados en los BDMS. Estn diseados para aplicaciones
que requieren tanto un procesamiento secuencial del archivo completo como un acceso aleatorio a registros individuales.
Hay dos tipos de ndices que pueden usarse;
n ndice denso. Aparece un registro ndice para cada valor de la clave de bsqueda en el archivo. El registro
contiene el valor de la clave de bsqueda y un puntero al registro.
n ndice escaso. Se crean registros ndices solamente para algunos de los registros. Para localizar un registro,
encontramos el registro ndice con el valor de la clave de bsqueda ms grande que sea menor o igual que el
valor que estamos buscando. Empezamos en el registro al que apunta el registro ndice y seguimos los
punteros del archivo hasta encontrar el registro deseado.

8.2.1. ndice primario.

Generalmente es ms rpido localizar un registro con un ndice denso que con uno escaso. Sin embargo, los
ndices escasos requieren menos espacio e imponen menos mantenimiento adicional para inserciones y eliminaciones.

73
Bases de Datos

El diseador del sistema debe lograr un equilibrio entre el tiempo de acceso y el espacio extra. Un buen
compromiso es tener un ndice escaso con una entrada de ndice por bloque.
Para que esta tcnica sea completamente general, debemos considerar el caso en el que los registros para un valor
de la clave de bsqueda ocupan varios bloques. Es fcil modificar el esquema para manejar esta situacin.
An cuando utilizamos un ndice escaso, el ndice puede llegar a ser demasiado grande para un procesamiento
eficiente. En la prctica, no es raro tener un archivo con 100.000 registros. Con 10 registros por bloque. Si tenemos un
registro ndice por bloque, el ndice tiene 10.000 registros. Los registros ndice son ms pequeos que los de datos, por
lo que podemos suponer que entran 100 por bloque, as pues el ndice ocupa 100 bloques.
Si un ndice es lo bastante pequeo como para guardarlo en memoria, el tiempo de bsqueda es corto. Sin
embargo, si le ndice es tan grande que debe guardarse en disco, una bsqueda puede ser costosa.
Para resolver este problema, tratamos el ndice como cualquier otro archivo secuencial, y construimos un ndice
escaso sobre el ndice primario, que puede almacenarse en memoria.
Utilizando los dos niveles de indexacin, hemos ledo nicamente un bloque de ndices en vez de 100. Si
suponemos que el ndice externo ya est en la memoria. Si el fichero es extremadamente grande, es posible que ni
siquiera el ndice exterior quepa en memoria principal, en este caso, podemos crear otro nivel de indexacin. En la
prctica, lo normal es que basten dos niveles.
Frecuentemente, cada nivel de ndice corresponde a una unidad de almacenamiento fsico. As, podemos tener
ndices en los niveles de pista, cilindro y disco.
Sin importar cual sea la forma de ndice que se utilice, se deben actualizar todos los ndices cada vez que se
inserta o elimina un registro del archivo. A continuacin describimos algoritmos para actualizar ndices de un slo nivel:
n Eliminacin. Para eliminar un registro, es necesario buscar el registro que se va a eliminar. Si el registro
eliminado era el ltimo que quedaba con ese valor particular de la clave de bsqueda, entonces eliminamos
el valor de la clave de bsqueda del ndice. Para ndices densos, eliminamos un valor de la clave de bsqueda
de la misma manera que se suprime en un archivo. Para ndices escasos, eliminamos un valor de clave
sustituyendo su entrada en el ndice por el siguiente valor de la clave de bsqueda. Si el siguiente valor ya
tiene una entrada de ndice, eliminamos la entrada.
n Insercin. Se hace una bsqueda usando el valor de la clave de bsqueda que aparece en el registro que se va
a insertar. Si el ndice es denso y el valor de la clave de bsqueda no aparece en el ndice, lo inserta. Si el ndice
es escaso no se necesita hacer ningn cambio en el ndice a menos que se cree un nuevo bloque. En este
caso, el primer valor de la clave de bsqueda que aparezca en el nuevo bloque se inserta en el ndice.

8.2.2. Indices secundarios.

Los ndices secundarios pueden estructurarse de forma diferente a los ndices primarios. Los punteros en el
ndice secundario no sealan directamente al archivo, en vez de ello, cada uno de esos punteros seala a una cubeta que
contiene punteros al archivo.
Este enfoque permite almacenar juntos todos los punteros de un valor de clave de bsqueda secundaria
determinado. Un enfoque as es til en ciertos tipos de consultas para los que podemos hacer una parte considerable de
procesamiento usando nicamente los punteros.
Para las claves primarias, podemos obtener todos los punteros para un valor de la clave de bsqueda primaria
determinado utilizando una revisin secuencial. Una revisin secuencial en orden de clave primaria es eficiente porque los
registros estn almacenados fsicamente en un orden que se aproxima al orden de la clave primaria. Sin embargo, no
podemos almacenar un archivo fsicamente ordenado tanto por la clave primaria como por una clave secundaria. Como
elorden de clave secundaria y el de clave fsica son distintos, si intentamos examinar el archivo secuencialmente en orden
de clave secundaria, es probable que la lectura de cada registro requiera la lectura de un nuevo bloque de disco.
Almacenando punteros en una cubeta, eliminamos la necesidad de punteros adicionales en los registros
mismos y de revisiones secuenciales en orden de clave secundaria.
El ndice secundario puede ser denso o escaso. Si es denso, entonces el puntero de cada cubeta individual seala
a los registros con el valor de la clave de bsqueda apropiado. Si el ndice secundario es escaso, entonces el puntero de
cada cubeta individual seala a los valores de la clave de bsqueda en un rango apropiado. En este caso, cada entrada de
cubeta es un puntero nico o bien un registro que consta de dos campos: un valor de la clave de bsqueda y un puntero
a algn registro de archivo.
Si las cubetas contienen nicamente punteros, debemos leer todos los registros a los que apunta la cubeta.
Asociando un valor de la clave de bsqueda con cada puntero de la cubeta, eliminamos la necesidad de leer registros con
un valor de la clave de bsqueda secundaria distinto del que estamos buscando.
La estructura de la cubeta puede eliminarse si el ndice secundario es denso y los valores de la clave primaria
forman parte de la clave de bsqueda.
El procedimiento descrito para la insercin y eliminacin puede aplicarse a un archivo con mltiples ndices.
Cada vez que se modifique el archivo es necesario actualizar todos los ndices.
Los ndices secundarios mejoran el rendimiento en las consultas que utilizan claves que no son primarias, sin
embargo, implican un gasto extra considerable en la modificacin de la BD. El diseador de una BD decide que ndices
secundarios son deseables, basndose en una estimacin de la frecuencia relativa de consultas y modificaciones.

8.3. Archivos indexados de rboles B+.

74
Tema 8. Indexacin y asociatividad (hashing).

La desventaja principal de la organizacin de archivo secuencial indexado es que el rendimiento baja al crecer el
archivo.: la estructura de archivo de rbol B+ es la ms ampliamente utilizada de varias estructuras de archivo que
mantienen su eficiencia a pesar de inserciones y eliminaciones. Un ndice de rbol toma B+ la forma de un rbol
equilibrado en el que cualquier camino desde la raz del rbol hasta una hoja tiene la misma longitud. Todos los nodos
del rbol tienen entre [n/2] (entero, redondeo superior) y n hijos, donde n es fijo para un determinado rbol.
Veremos que la estructura de rbol B+ impone un cierto gasto extra durante la insercin y la eliminacin,
adems de requerir un determinado espacio extra. No obstante, esto es aceptable en el caso de archivos con una
frecuencia alta de modificacin, ya que se evita el coste de la reorganizacin del archivo.
Un ndice de rbol B+ tiene varios niveles, pero tiene una estructura que difiere de la del archivo secuencial de
ndices de varios niveles. Un nodo tpico de un rbol B+ es de la forma:
P1 K1 P2 Pn-1 Kn-1 Pn
Contiene hasta n-1 valores de clave de bsqueda K, y n punteros P. Los valores de la clave de bsqueda dentro
de un nodo se guardan en un determinado orden, as, si i<j, entonces K i<Kj.
Consideramos primero la estructura de los nodos hoja. Para 1i<n, Pi apunta a cualquier registro del archivo
con un valor de clave de bsqueda K i o a una cubeta de punteros, cada uno de los cuales apunta a un registro del archivo
con valor clave de bsqueda Ki. La estructura de cubeta se utiliza solamente si la clave de bsqueda no forma una clave
primaria y el archivo no est ordenado en el orden del valor de la clave de bsqueda. El puntero Pn tiene un propsito
general que indicaremos despus.
Ahora que hemos visto la estructura de un nodo hoja, consideremos como se asignan valores de clave de
bsqueda a nodos especficos. Cada nodo hoja puede tener hasta n-1 valores, y se permite que tengan un mnimo de
[(n-1)/2] valores, adems, los rangos de valores de cada hoja no se solapan. As, si Li y Lj son nodos hoja e i<j, entonces
todos los valores de la clave de bsqueda en Li son menores que cualquiera de la clave Lj. El conjunto de nodos hoja de
un rbol B+ debe formar un ndice denso de manera que cada valor de la clave de bsqueda aparezca en algun nodo hoja.
Ahora podemos explicar el uso del puntero Pn. Ya que existe un orden lineal de las hojas, basado en los valores
de clave de bsqueda que contienen, usamos Pn para encadenar los nodos hoja en orden de clave de bsqueda.. Esto
permite un procesamiento secuencial del archivo en forma eficiente.
Los nodos del rbol B+ que no son hojas, forman un ndice escaso de varios niveles. La estructura de los
nodos que no son hoja es la misma que la de los hoja, excepto que todos los punteros apuntan a nodos del rbol. Un
nodo puede tener hasta n punteros, pero debe tener por lo menos [n/2] punteros. Consideremos un nodo que
contiene m punteros. Si 1<i<m, el puntero Pi apunta la estructura que contiene los valores de la clave de bsqueda
menores que K i y mayores o iguales a K i-1. El puntero Pm apunta a la parte del subrbol que contiene aquellos valores de
la clave mayores que o iguales a Km-1, y el puntero P1 apunta a la parte del subrbol que contiene aquellos valores de la
clave de bsqueda menores que K 1.
El requisito de que cada nodo tenga por lo menos [n/2] punteros es obligatorio en todos los niveles del rbol
excepto en la raz.
Un rbol B+ para el archivo depsito, con n=3, suprimiendo los punteros al archivo por simplicidad, ser de la
forma:

Siempre es posible construir un rbol B+, para cualquier n, en el que todos los nodos distintos del raz
contienen por lo menos [n/2] punteros.
Todos los ejemplos que hemos dado de rboles B+ han sido equilibrados. Es decir, la longitud de cualquier
camino desde la raz hasta un nodo hoja es la misma. Esta propiedad es un requisito de un rbol B+. De hecho, la B
significa balanced (equilibrado). La propiedad de equilibrio de los rboles B+ es la que asegura un buen rendimiento en
las bsquedas, inserciones y eliminaciones.
Supngase que queremos encontrar todos los registros con un valor de clave de bsqueda k. Primero
examinamos el nodo raz y buscamos el valor de clave de bsqueda ms pequeo mayor que k. Supngase que el valor
de la clave de bsqueda es Ki. Seguimos el puntero Pi-1 a otro nodo. Si tenemos m punteros en el nodo, y KKm-1,
entonces seguimos Pm a otro nodo. Una vez ms buscamos el valor de la clave de bsqueda ms pequeo mayor que k y
seguimos el correspondiente puntero. Finalmente llegamos a un nodo hoja, donde el puntero nos seala en registro o
la cubeta deseada.
As, al procesar una consulta se atraviesa un camino en el rbol desde la raz a una hoja. Si hay K valores de la
clave de bsqueda en el archivo, el camino no es ms largo que log[n/2](K). En la prctica, significa que slo se necesita
tener acceso a unos pocos nodos aunque el archivo sea muy grande. En la mayora de los casos, un nodo se hace para
que tenga el mismo tamao de un bloque del disco.

75
Bases de Datos

La insercin y la eliminacin son ms complicadas que la bsqueda, ya que puede ser necesario partir un nodo,
o combinar dos si se hacen demasiado pequeos. Adems, cuando se parte un nodo o se combinan un par de nodos,
debemos asegurarnos de que el equilibrio se conserva. Para introducir la idea de insercin y eliminacin en un rbol B+,
supongamos temporalmente que los nodos nunca llegan a ser demasiado grandes o demasiado pequeos. Bajo esta
suposicin, la insercin y la eliminacin son de la forma:
n Insercin. Utilizando la misma tcnica de la bsqueda, encontramos el nodo hoja en el que aparecera l valor
de la clave de bsqueda. Si el valor de la clave de bsqueda ya aparece en el nodo hoja, aadimos el nuevo
registro al archivo, y si es necesario un puntero a la cubeta. Si el valor de la clave de bsqueda no aparece,
insertamos el valor en el nodo hoja y lo posicionamos de forma que las claves de bsqueda estn todava en
orden. Entonces, insertamos el nuevo registro en el archivo, y si es necesario, creamos una nueva cubeta con
el puntero apropiado.
n Eliminacin. Utilizando la misma tcnica de la bsqueda, encontramos el registro que se va a eliminar y lo
quitamos del archivo. El valor de la clave de la bsqueda se quita del nodo hoja si no hay ninguna cubeta
asociada con el valor de la clave de bsqueda o si la cubeta queda vaca como resultado de la eliminacin.
Ahora consideremos un ejemplo en el que es necesario partir un nodo. Supngase que queremos insertar un
registro con un valor nombre_sucursal=Clearview en el rbol B+ de la figura anterior. Empleando el algoritmo de
bsqueda vemos que Clearview aparecera en el nodo que contiene Brighton y Downttown., y no hay espacio para
insertarlo. Por tanto, el nodo se parte en dos, quedando en uno Brighton y Clearview y en el otro Downtown. En
general tomamos los n valores de clave de bsqueda (los n-1 de la hoja ms el que se inserta) y ponemos el primero en
el nodo existente y los valores restantes en el nuevo nodo.
Habiendo partido un nodo hoja, debemos insertar el nodo hoja nuevo en la estructura del rbol B+. En
nuestro ejemplo, el nodo nuevo tiene a Downtown como valor ms pequeo de la clave de bsqueda. Necesitamos
insertar este valor de clave de bsqueda en el padre del nodo hoja que se parti. En nuestro ejemplo se inserta el valor
Downtown en el padre, porque hay espacio disponible de clave de bsqueda. Si no hubiera sido as se hubiera tenido
que partir el padre. En el peor de los casos, se deben partir todos los nodos a lo largo del camino hacia la raz. Si la
misma raz se parte, el rbol se hace ms profundo.
La tcnica general de insercin en un rbol B+ es determinar el nodo hoja l en el que se debe hacer la insercin. Si
tiene lugar una particin, se inserta el nuevo nodo en el padre del nodo l. Si esta insercin causa una particin, se procede
recursivamente hasta que o bien una insercin no cause una particin o se cree una nueva raz.
Ahora consideramos las eliminaciones que causan que tres nodos contengan muy pocos punteros. Primero
eliminemos Downtown del rbol B+ resultado de la insercin anterior. Localizamos la entrada de Downtown usando el
algoritmo de bsqueda. Cuando eliminamos la entrada de Downtown de su nodo hoja, la hoja queda vaca. Puesto que
el ejemplo n=3, y 0<[(n-1)/2], se debe eliminar este nodo del rbol B+. Para eliminar un nodo hoja, debemos eliminar
el puntero que le apunta desde el padre. ste deja el nodo padre, que tena tres punteros, con slo dos punteros. Puesto
que 2[n/2], el nodo todava es suficientemente grande y se ha finalizado la operacin de eliminacin.
Cuando se hace una eliminacin en un padre de un nodo hoja, es posible que el nodo padre se vuelva
demasiado pequeo. Esto es exactamente lo que ocurre si eliminamos Perryridge. Cuando eliminamos el puntero a este
nodo hoja en su padre, el padre queda con slo un apuntador. Puesto que n=3, [n/2=2], y, por tanto, un nico
puntero es muy poco. Sin embargo, como el nodo contiene informacin til, no podemos simplemente eliminarlo. En
vez de ello, examinamos el nodo hermano. Este nodo hermano tiene espacio para incluir la informacin del nodo que
ahora es demasiado pequeo, por lo que podemos juntar estos nodos, de forma que el nodo hermano ahora contiene
las claves Mianus y Redwood. El otro nodo, el primero, ahora contiene informacin redundante y puede eliminarse de
su padre. Obsrvese que la raz quedo vaca despus de la eliminacin, por lo que se redujo en un nivel la profundidad
del rbol B+.
No siempre es posible fusionar nodos, lo que ocurre cuando el nodo hermano ya contiene el mximo de
punteros. La solucin en este caso es redistribuir los punteros de forma que cada hermano tenga los mismos punteros.
Obsrvese que la redistrubicin de valores necesita un cambio de un valor de clave de bsqueda en el padre de los dos
hermanos. En general, para eliminar un nodo en el rbol B+, realizamos una bsqueda del valor y lo eliminamos. Si el
nodo es demasiado pequeo, lo eliminamos de su padre.
Aunque las operaciones de insercin y eliminacin en rboles B+ son complicadas, requieren relativamente
pocas operaciones. Puede demostrarse que el nmero de operaciones que se necesita en el peor de los casos para una
insercin o eliminacin es proporcional al logaritmo del nmero de claves de bsqueda. La velocidad de las operaciones
en los rboles B+ es la que hace que se utilicen frecuentemente como estructuras de ndices en implementaciones de BD.

8.4. Archivos indexados de rboles B.


Los ndices de rboles B son similares a los ndices de rboles B+. La principal diferencia entre los dos enfoques
es que un rbol B elimina el almacenamiento redundante de valores de clave de bsqueda. Todos los valores de la clave
de bsqueda aparecen en algn nodo hoja.
Un rbol B permite que los valores de clave de bsqueda aparezcan una sola vez. Puesto que no se repiten las
claves de bsqueda en el rbol B, podemos almacenar el ndice utilizando menos nodos que en el rbol B+
correspondiente. Sin embargo, puesto que las claves de bsqueda que aparecen en los nodos no aparecen en ningn otro
sitio del rbol B, estamos obligados a incluir un campo de puntero adicional para cada clave de bsqueda en un nodo
que no sea hoja. Estos punteros adicionales apuntan a registros de archivos o cubetas para la clave de bsqueda asociada.
Los rboles B ofrecen una ventaja adicional con respecto a los rboles B+ aparte de eliminar el almacenamiento
redundante de claves de bsqueda. En una bsqueda en un rbol B+, siempre es necesario recorrer un camino desde la

76
Tema 8. Indexacin y asociatividad (hashing).

raz del rbol hasta algn nodo hoja. Sin embargo, en un rbol B, a veces es posible encontrar el valor deseado antes de
leer un nodo hoja. As, la bsqueda es ligeramente ms rpida en un rbol B, aunque en general el tiempo de bsqueda
todava es proporcional al logaritmo del nmero de claves de bsqueda.
Estas ventajas del rbol B sobre el B+ se compensan con varias desventajas:
n Los nodos hojas y los que no son hoja tienen el mismo tamao en una rbol B+. En un rbol B, los
nodos que no son hoja son ms grandes, lo que complica la gestin del almacenamiento del ndice.
n La eliminacin de un rbol B es ms complicada. En un rbol B+, la entrada eliminada siempre aparece en
una hoja. En un rbol B, la entrada puede aparecer en un nodo que no sea hoja. Se debe seleccionar del
subrbol del nodo que contiene la entrada eliminada el valor apropiado para sustituirlo. De manera
especfica, si se elimina la clave de bsqueda K i, la clave de bsqueda ms pequea que aparece en el subrbol
del puntero Pi+1 debe pasarse al campo que antes ocupaba K i.
Las ventajas de los rboles B son de poca importancia para ndices grandes. As, muchos implementadores de
DBMS prefieren la simplicidad estructural de los rboles B+.

8.5. Funciones de asociacin (hash) esttica.


Una desventaja de los esquemas de ndices es que debemos acceder a una estructura de ndices para localizar
datos. La tcnica de asociacin (hashing) nos permite evitar el acceso a una estructura de ndices. Suponemos que el ndice
denso est dividido entre un nmero de diferentes cubetas. La direccin de la cubeta que contiene un puntero al dato
deseado se obtiene directamente calculando una funcin sobre el valor de la clave de bsqueda del registro deseado.
Formalmente, K representa el conjunto de todos los valores de la clave de bsqueda, y B el conjunto de todas las
direcciones de la cubeta. Una funcin de asociacin (hash) h es una funcin de K a B.
El principio bsico de la asociatividad es que, aunque el conjunto K de las claves sea grande, el conjunto {K 1,
K2, , Kn} de valores de clave de bsqueda realmente almacenados en la BD es mucho ms pequeo que K. En el
momento de hacer el diseo no conocemos los valores de la clave de bsqueda que se almacenarn, pero sabemos que
hay demasiados valores posibles para justificar la asignacin de una cubeta a cada uno de ellos. Sin embargo, sabemos en
el momento de hacer el diseo, aproximadamente cuantos valores de clave de bsqueda van a ser almacenados en la BD.
Elegimos el nmero de cubetas para hacer la correspondencia con el nmero de valores de la clave de bsqueda que
esperamos tener almacenados. La funcin de asociacin es la que define la asignacin de valores de la clave de bsqueda a
cubetas especficas.
Las funciones de asociacin deben disearse con cuidado. Una funcin de asociacin deficiente puede resultar
en una bsqueda que tarde un tiempo proporcional al nmero de claves de bsqueda en el archivo. Una funcin bien
diseada da un tiempo de bsqueda promedio que es una constante (pequea), independiente del nmero de claves de
bsqueda en el archivo. Esto se logra asegurndose de que, en promedio, los registros se distribuyen uniformemente
entre las cubetas.
Sea h una funcin. Para realizar una bsqueda del valor de clave Ki, simplemente calculamos h(Ki) y buscamos
la cubeta con esa direccin. Supngase que dos claves de bsqueda, K 5 y K 7, tienen el mismo valor de asociacin, es decir,
h(K5)=h(K7). Si buscamos K5, la cubeta h(K5) contiene registros con valores de la clave de bsqueda K5 y de K7. As,
tenemos que comprobar el valor de la clave de bsqueda de todos los registros de la cubeta para verificar que el registro es
uno de los que queremos.
La peor funcin de asociacin posible asigna todos los valores de clave de bsqueda a la misma cubeta. Esto es
indeseable, ya que el ndice denso completo se guarda en la misma cubeta, y , por tanto, la bsqueda requiere la revisin
del ndice completo. Una funcin de asociacin ideal asigna cada valor de la clave de bsqueda a una cubeta distinta. Una
funcin as es ideal porque cada registro de la cubeta que se examina, como resultado de una bsqueda tiene el valor de
clave de bsqueda deseado.
Puesto que en el momento de hacer el diseo no sabemos con precisin los valores de clave de bsqueda,
queremos elegir una funcin de asociacin que asigne valores de la clave de bsqueda a las cubetas, de manera que:
n La distribucin sea uniforma. Es decir, se asigne a cada cubeta el mismo nmero de valores de la clave de
bsqueda del conjunto de todos los valores posibles de la clave de bsqueda.
n La distribucin sea al azar. Es decir, en el caso promedio, cada cubeta tendr casi el mismo nmero de
valores asignados.
Intentemos elegir una funcin de asociacin para el archivo depsito utilizando la clave de bsqueda
nombre_sucursal. Supngase que decidimos tener 26 cubetas y definimos una funcin de asociacin que asigna
nombres que empiezan con la letra i del alfabeto a la cubeta i-sima. Esta funcin de asociacin es muy sencilla, pero falla
en la distribucin uniforme, ya que esperamos ms nombres de sucursales que empiecen con B y R que con Q y X.
Las funciones de asociacin tpicas realizan algn clculo sobre la representacin binaria interna a la mquina de
los caracteres de la clave de bsqueda. Una funcin de asociacin sencilla de este tipo es calcular la suma, el mdulo del
nmero de cubetas de la representacin binaria de los caracteres de una clave que se han asignado.
La insercin es casi tan simple como la bsqueda. Si el valor de la clave de bsqueda del registro que se va a
insertar es K i, calculamos h(Ki) para localizar la cubeta para ese registro.
La eliminacin es tan directa como la insercin. Si el valor de la clave de bsqueda del registro que se va a
eliminar es K i, calculamos h(Ki) y buscamos la cubeta correspondiente para ese registro.
La forma de estructura de asociatividad que hemos descrito a veces se conoce como asociatividad abierta.
Bajo un enfoque alternativo, llamado asociatividad cerrada, se almacenan todos los registros en una cubeta y la
funcin de asociacin calcula las direcciones dentro de la cubeta. La asociatividad cerrada se utiliza frecuentemente en la

77
Bases de Datos

construccin de tablas de smbolos para compiladores y ensambladores, pero se prefiere la asociatividad abierta para
DBMS. La razn es que la eliminacin resulta problemtica cuando se emplea asociatividad cerrada.
Una desventaja importante de la forma de asociatividad que acabamos de describir es que la funcin de
asociacin debe elegirse cuando implementamos el sistema y no se puede cambiar fcilmente despus. Puesto que la
funcin h asigna valores de la clave de bsqueda a un conjunto fijo B de direcciones de cubetas, desperdiciamos si B es
excesivamente grande. Si B es demasiado pequeo, las cubetas contendrn registros de muchos valores diferentes de la
clave de bsqueda y el rendimiento disminuir. Normalmente, eligiendo el tamao de B el doble del nmero de valores
de la clave de bsqueda en el archivo puede lograrse un buen equilibrio entre espacio y rendimiento.

8.6. Funciones de asociacin (hash) dinmica.


Como hamos visto, la necesidad de fijar el conjunto B de direcciones de cubetas es un problema serio de la
tcnica de asociacin esttica. La mayora de las BD crecen conforme pasa el tiempo. Si vamos a usar asociacin esttica es
una BD de este tipo, se presentan tres clases de opciones:
n Elegir una funcin de asociacin basada en el tamao actual del archivo. Dar como resultado una
degradacin del rendimiento conforme crezca la BD.
n Elegir una funcin de asociacin basada en el tamao anticipado del archivo en el mismo punto en el
futuro. Aunque se evita la degradacin, al principio se desperdicia mucho espacio.
n Reorganizar peridicamente la estructura de asociacin como respuesta al crecimiento del archivo. Una
reorganizacin as implica la eleccin de una nueva funcin de asociacin, volver a calcular la funcin de
asociacin para cada uno de los registros y generar nuevas asignaciones de las cubetas, lo que conlleva un
elevado consumo de tiempo. Adems es necesario prohibir el acceso al archivo durante la reorganizacin.
Existen varias tcnicas de asociacin que permiten modificar de manera dinmica la funcin de asociacin para
compensar el crecimiento o reduccin de la BD. Estas tcnicas se llaman funciones de asociacin (hash) dinmica. A
continuacin describimos una forma de asociacin dinmica llamada asociacin extensible.
La asociacin extensible maneja los cambios en el tamao de la BD dividiendo y fusionando cubetas conforme
la BD crece y se reduce. Como resultado se mantiene la eficiencia de espacio. Adems, puesto que la reorganizacin se
realiza cada vez nicamente en una cubeta, el tiempo extra requerido es aceptablemente bajo.
Con la asociacin extensible elegimos una funcin de asociacin h con las propiedades deseables de
uniformidad y aletoriedad. Sin embargo, esta funcin de asociacin genera valores en un rango relativamente grande de
enteros binarios de b bytes.
No creamos una cubeta para cada valor de asociacin, creamos cubetas segn la demanda, segn se insertan
registros. Inicialmente no usamos los b bytes de la asociacin. En un momento dado utilizamos i bytes, donde 0ib..
Estos i bytes representan una posicin relativa en una tabla adicional de direcciones de cubetas. El valor de i aumenta y
disminuye con el tamao de la BD.

Aunque se requieren i bytes para encontrar la entrada correcta en la tabla de direcciones de cubetas, varias
entradas consecutivas de la tabla pueden apuntar a la misma cubeta. Todas esas entradas tendrn un prefijo comn de
asociacin, pero la longitud de este prefijo puede ser menor que i. Por tanto, con cada cubeta asociamos un entero dando
la longitud del prefijo comn de asociacin.
Para localizar la cubeta que tiene el valor de la clave de bsqueda Kl tomamos los primeros i bytes de h(Kl),
vemos la entrada de la tabla que corresponde a esa cadena da bytes, y seguimos el puntero de la cubeta en la entrada de la
tabla..
Para insertar un registro con valor de clave de bsqueda K l, seguimos el mismo procedimiento que antes para la
bsqueda, terminando en alguna cubeta, llammosla j. Si hay sitio en la cubeta insertamos la informacin apropiada y
despus insertamos el registro en el archivo. Si la cubeta est llena, debemos partirla y redistribuir los registros actuales
ms el nuevo. Para partir la cubeta, primero debemos determinar si necesitamos aumentar el nmero de bytes que
usamos en la asociacin.
n Si i=ij. Entonces solamente una entrada en la tabla de direcciones de cubetas apunta a la cubeta j. Por tanto,
necesitamos aumentar el tamao de la tabla de direcciones de cubetas de forma que podamos incluir
punteros en las dos cubetas que resultan de la particin de j. Hacemos esto considerando un bit adicional
de la asociacin. Incrementamos el valor de i en 1, duplicando as el tamao de la tabla. Cada entrada se

78
Tema 8. Indexacin y asociatividad (hashing).

sustituye por dos, cada una de las cuales contiene el mismo puntero que la original. Ahora dos entradas en
la tabla de direcciones de cubetas apuntan a la cubeta j. Asignamos una nueva cubeta (z, por ejemplo) y
hacemos que la segunda entrada apunte a la nueva cubeta. Ponemos ij e iz a i. A continuacin, se reasocia
cada registro de la cubeta j y dependiendo de los i (ahora vale iinicial+1) o se guarda en la cubeta j o bien se
asigna a la cubeta z recin creada. Ahora reintentamos la insercin del nuevo registro, y normalmente tendr
xito, sin embargo, si todos los registros de la cubeta j y el nuevo registro tienen el mismo prefijo de valor
de asociacin, ser necesario volver a partir una cubeta. Si la funcin de asociacin se elige con cuidado, no es
probable que una nica insercin requiera que una cubeta se parta ms de una vez.
n Si i>ij. Entonces ms de una entrada en la tabla apuntan a la cubeta j. As, podemos partir la cubeta j sin
aumentar el tamao de la tabla de direcciones de cubetas. Obsrvese que todas las entradas que apuntan a la
cubeta j corresponden a prefijos de asociacin que tienen el mismo valor en los bytes ij ms ala izquierda.
Asignamos una nueva cubeta (digamos z) y ponemos ij e iz al valor que resulta de aadir 1 al valor ij
original. A continuacin necesitamos ajustar las entradas en la tabla de direcciones de cubetas que
anteriormente apuntaban a la cubeta j. Dejamos la primera mitad de las entradas como estaban y ponemos
todas las dems en la recin creada z. A continuacin, como en el caso que vimos antes, se reasocia cada
registro de la cubeta j y se reasignan a j o z segn corresponda. Se reintenta la insercin En el caso menos
probable de que vuelva a fallar, aplicamos uno de estos dos casos de nuevo.
Obsrvese que en ambos caos necesitamos volver a calcular la funcin de asociacin nicamente en los registros
de la cubeta j.
Para eliminar un registro con valor de clave de bsqueda K l, seguimos el mismo procedimiento que antes para
la bsqueda, terminando en alguna cubeta, digamos j. Sacamos la clave de bsqueda de la cubeta y el registro del archivo.
La cubeta tambin se elimina si queda vaca, en este momento se pueden unir varias cubetas y el tamao de la tabla de
direcciones de cubetas se puede partir en dos.
Examinemos ahora las ventajas y desventajas de la asociacin extensible comparada con las otras planificaciones
que se han estudiado. La ventaja principal de la asociacin extensible es que el rendimiento no disminuye conforme crece
el archivo. Adems, se requiere un mnimo espacio adicional. Aunque la tabla de direcciones de cubetas ocupa un espacio
extra adicional, contiene un puntero para cada valor de asociacin con la longitud del prefijo actual, as pues la tabla es
pequea, y no es necesario reservar cubetas para un crecimiento futuro; las cubetas pueden asignarse de manera dinmica.
Una desventaja de la asociacin extensible es que la bsqueda implica un nivel de indireccin especial, ya que
debemos tener acceso a la tabla de direcciones de cubetas antes de acceder a la cubeta en s. Esta referencia extra slo tiene
un impacto de poca importancia en el rendimiento, impacto que aumenta al llenarse la BD.
As pues, la asociacin extensible parece ser una tcnica muy atractiva, siempre que se quiera aceptar la
complejidad aadida que implica su implementacin.

8.7. Comparacin de indexacin y asociacin (hash).


La mayor parte de los DBMS utilizan slo unas pocas o una forma de indexacin o de asociacin. Para tomar la
decisin apropiada, el implementador o el diseador de la BD deben considerar los siguientes factores:
n Es aceptable el coste de la reorganizacin peridica del ndice o estructura de asociacin?
n Cul es la frecuencia relativa de inserciones y eliminaciones?
n Es deseable optimizar el tiempo de acceso promedio a expensas de aumentar el tiempo de acceso en el
peor de los casos?
n Qu tipos de consultas harn normalmente los usuarios?
Ya hemos examinado los tres primeros factores en la revisin de los mriots relativos de las tcnicas
especificadas de asociacin. El cuarto factor, el tipo esperado de consulta, es crtico para la eleccin de indexacin o
asociacin.
Si la mayor parte de las consultas son de la forma:
select A1, A2, , An
from r
where Ai=c
entonces, al procesar esta consulta, el sistema realizar una bsqueda en el ndice o estructura de asociacin
correspondiente al atributo Ai para el valor c. Para consultas de esta forma es preferible un esquema de asociacin. La
bsqueda en un ndice requiere un tiempo proporcional al logaritmo del nmero de valores de Ai en r, sin embargo, en
una estructura de asociacin, el tiempo promedio de bsqueda es una constante independiente del tamao de la BD. La
nica ventaja del ndice para esta forma de consulta es que el tiempo de bsqueda en el peor de los casos es proporcional
al logaritmo del nmero de valores de Ai en r, en cambio, con la asociacin, el tiempo de bsqueda en el peor de los
casos es proporcional al nmero de valores de Ai en r.
Las tcnicas de indexacin son preferibles a la asociacin en los casos en los que se especifica un rango de valores
en la consulta. Una consulta de este tipo tiene la forma siguiente:
select A1, A2, , An
from r
where Aic2 and Aic1
En otras palabras, esta consulta encuentra todos los registros con valores de Ai entre c1 y c2.
Utilizando un ndice, primero buscamos el valor c1, y seguimos la cadena de punteros del ndice para leer la
siguiente cubeta en orden alfabtico y continuar de esta manera hasta alcanzar c2.

79
Bases de Datos

Si tenemos una estructura de asociacin, podemos buscar c1 y localizar la cubeta correspondiente, pero no es
fcil determinar cul es la siguiente cubeta. La dificultad surge del hecho de que una funcin de asociacin buena asigna
valores a las cubetas aleatoriamente.
Si queremos atender consultas de rangos utilizando una estructura de asociacin, debemos elegir una funcin
de asociacin que conserve el orden, es decir, si K1 y K2 son valores de la clave de bsqueda y K1<K2, entonces
h(K1)<h(K2). Una funcin de este tipo asegura que las cubetas estn en orden de clave. Es difcil encontrar una funcin
de asociacin que conserve el orden y cumpla los requisitos de aletoriedad y uniformidad.
Debido a la dificultad para encontrar una buena funcin de asociacin que conserve el orden, la mayor parte de
los sistemas utilizan indexacin.

8.8. Definicin de ndice en SQL.


El estndar permite al compilador de SQL la libertad de elegir cmo implementar el cumplimiento de las
claves. Las implementaciones tpicas hacen cumplir una declaracin de clave creando un ndice con la clave declarada como
la clave de bsqueda del ndice.
Algunas implementaciones de SQL incluyen ordenes especficas de definicin de datos para crear y truncar
ndices, entre las que estn el Sequel original y el SAA-SQL de IBM. A continuacin presentamos las ordenes de ndice
del SAA-SQL.
Un ndice se crea mediante la orden create index, que tiene la forma:
create index <nom_ndice> on <nom_relacin> (<lista_de_atributos>)
La lista_de_atributos es la lista de atributos de las relaciones que forman la clave de bsqueda para el ndice.
Para definir un ndice en la relacin sucursal con clave de bsqueda nombre_sucursal, escribimos:
create index ndice_b on sucursal (nombre_sucursal)
Si deseamos declarar que la clave de bsqueda es una clave candidata, aadimos el atributo unique a la
definicin de ndice, entre create e index.
Si en el momento en que se introduce create unique index, el atributo no es una clave candidata, se presentar
un mensaje de error y fallar el intento de crear el ndice. Si el intento de crear el ndice tiene xito, cualquier intento
subsiguiente de insertar una tupla que viole la declaracin de clave fallar.
El nombre de ndice especificado para un ndice se requiere de forma que sea posible truncar ndices. La orden
drop index tiene la forma:
drop index <nom_ndice>

8.9. Acceso por claves mltiples.


Para ciertos tipos de consultas resulta til usar ndices mltiples, si existen.
Supngase que el archivo depsito tiene dos ndices, uno por nombre_sucursal y otro por nombre_cliente.
Considrese encontrar todas las cuentas de un cliente en una sucursal. Existen tres posibles estrategias para procesar esta
consulta:
n Utilizar el ndice de nombre_sucursal para encontrar todas las cuentas de la sucursal y examinar todos esos
registros para ver cuales son los de el cliente.
n Utilizar el ndice de nombre_cliente para encontrar todas las cuentas del cliente y examinar todos esos
registros para ver cuales son los de la sucursal.
n Tomar la interseccin de estos dos conjuntos de punteros. Aquellos punteros que estn en la interseccin
apuntan a registros pertenecientes tanto al cliente como a la sucursal.
La tercera estrategia es la nica de las tres que aprovecha la existencia de ndices mltiples. Sin embargo. Incluso
esta estrategia puede ser pobre si se cumplen las siguientes condiciones: existen muchos registros para una sucursal,
existen muchos registros para el cliente, hay pocos registros que pertenezcan al cliente y a la sucursal.
Si se cumplen estas condiciones, debemos examinar un gran nmero de punteros para producir un resultado
pequeo.
Para acelerar el procesamiento de consultas con mltiples claves de bsqueda pueden mantenerse varias
estructuras especiales. Consideraremos dos de estas estructuras: la estructura de rejilla y las funciones de asociacin
divididas.

8.9.1. Estructura de rejilla.

Una estructura de rejilla para estructuras que usan dos claves de bsqueda es un array bidimensional indexado
por los valores de las claves de bsqueda. Para realizar una bsqueda, buscamos una de las claves en las columnas y la
otra en las filas. Esa entrada contiene punteros a todos los registros en los que coinciden las claves de bsqueda pedidas.
No es necesario realizar clculos especiales, y solamente se accede a los registros necesarios para responder a la
consulta.
La estructura de rejilla tambin es apropiada para consultas que implican una sola clave de bsqueda., los
punteros que aparecen en toda la fila o columna de la clave buscada son la respuesta a la consulta.

80
Tema 8. Indexacin y asociatividad (hashing).

Conceptualmente es sencillo extender el enfoque de estructura de rejilla a cualquier nmero de claves de


bsqueda.
Las estructuras de rejilla proporcionan una mejora importante en el tiempo de procesamiento para las consultas
de claves mltiples. Sin embargo, requieren cierta cantidad de espacio y tiempo extra en las inserciones y eliminaciones de
registros.

8.9.2. Funcin de asociacin dividida.

Otra manera de enfocar las consultas de claves mltiples es usando una funcin de asociacin dividida.
Supngase que deseamos construir una estructura adecuada para consultas en el archivo depsito que implican tanto a
nombre_cliente como a nombre_sucursal. Construimos una estructura de asociacin para la clave (nombre_cliente,
nombre_sucursal). La nica diferencia entre la estructura que vamos a crear y las que vimos anteriormente es que
imponemos una restriccin adicional sobre la funcin de asociacin h. Los valores de asociacin se dividen en dos partes.
La primera parte depende slo del valor de nombre_cliente y la segunda depende slo de nombre_sucursal. La funcin
de asociacin se denomina dividida porque los valores de asociacin se dividen en segmentos que dependen de cada
elemento de la clave. As, si utilizamos valores de bsqueda de seis bits, los tres primeros dependen del valor de
nombre_cliente y los tres ltimos de nombre_sucursal.
Como era el caso del archivo de rejilla, la asociacin dividida se extiende a un nmero arbitrario de atributos.
Podemos hacer varias mejoras en la asociacin dividida si sabemos con que frecuencia especificar el usuario cada uno de
los atributos en una consulta.
Existen otras varias tcnicas hbridas para procesar consultas de claves mltiples. Tales tcnicas pueden ser tiles
en aplicaciones en las que la persona que implementa el sistema sabe que la mayora de las consultas sern de una forma
restringida.

81

Vous aimerez peut-être aussi