Académique Documents
Professionnel Documents
Culture Documents
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.
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.
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.
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.
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+.
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.
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.
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.
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).
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