Você está na página 1de 0

S

i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

1
Algunas Estructuras de ndices
de Claves Simples y Compuestas

I ntroduccin

En este documento presentaremos algunas de las estructuras ms usadas comercialmente
para implementar ndices, tanto de clave simple como de clave compuesta.


1. ndices de Clave Simple
Este tipo de ndice se crea sobre un solo atributo de la tabla y solo sirve para bsquedas a
travs del mismo.


1.1. ndices con Tcnicas de rbol
En la actualidad los rboles B se han convertido en la estructura ms usada para la
organizacin de archivos y registros. En el rea de bases de datos, una variante de ellos, los
rboles B+, son el tipo de estructura ms usada para la implementacin de ndices, especialmente
ndices cluster.

Al trabajar con grandes cantidades de informacin, en general no es posible o deseable
mantener la estructura completa en la memoria principal. En general, una pequea porcin de la
estructura es mantenida en el almacenamiento primario, y los datos adicionales se leen del
almacenamiento secundario por demanda. Los rboles B son rboles balanceados que estn
optimizados para situaciones donde parte o inclusive todo el rbol debe ser mantenido en
almacenamiento secundario. Como los accesos a disco son operaciones costosas en trminos de
tiempo, un rbol B intenta minimizar el nmero de accesos. El rbol B+ es una variante del
rbol B, que introduce ventajas significativas para el procesamiento secuencial de la informacin.


1.1.1. rbol B
Por definicin, cada nodo de un rbol B de orden d contiene como mximo 2d entradas,
compuestas por una clave y un puntero a la ubicacin de almacenamiento de los datos
correspondientes a la clave y 2d+1 punteros a otros nodos. El nmero de entradas almacenadas
vara segn el nodo, pero cada uno debe tener al menos d claves y d+1 punteros. Por lo tanto, cada
nodo se encuentra siempre completo al 50 % como mnimo, a excepcin del nodo raz que siempre
existe y por lo tanto puede tener cualquier cantidad de elementos.

Las claves son mantenidas en forma ordenada en cada nodo, y la lista de punteros est
esparcida entre las claves para indicar el camino de bsqueda de una clave, si la misma no se
encuentra en el nodo actual.
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

2
... ... ... ... ... ... ...


La ventaja de los rboles B yace en el hecho de que las operaciones de insercin y borrado
siempre dejan al rbol balanceado. En el caso de un rbol binario, inserciones aleatorias pueden
dejar el rbol desbalanceado. Mientras que un rbol desbalanceado tendr algunos trayectos ms
largos que otros, un rbol balanceado tendr todas sus hojas a la misma profundidad. El camino
ms largo en un rbol B de n claves contiene como mximo unos log
d
n nodos, siendo d el orden
del rbol. Una bsqueda podra llegar a visitar n nodos en un rbol desbalanceado, pero nunca
visitara 1+log
d
n nodos en un rbol B de orden d.

En el siguiente cuadro se muestran distintas combinaciones para el tamao del nodo y la
cantidad de registros, donde se puede observar claramente que a medida que aumenta el tamao del
nodo, disminuye la altura del rbol, y por ende la cantidad de accesos a disco necesarios.









Tabla de cantidad mxima de accesos a disco para una bsqueda


Como cada visita a un nodo requiere de acceso al almacenamiento secundario, para que el
costo sea mnimo, el rbol debe mantenerse balanceado. Si se elige el orden del rbol de forma tal
que el tamao de un nodo corresponda al tamao de un bloque, se puede reducir la cantidad de
accesos a disco.

En cada insercin se baja hasta la hoja correspondiente y si hay lugar se agrega la clave. Si
con dicha insercin se viola el lmite mximo de 2d elementos, entonces la hoja se parte en dos,
redistribuyendo las claves y la que corresponde al valor del medio sube como padre de las dos
nuevas hojas. A su vez, si dicha clave (la que sube) encuentra lugar en el nodo superior, se inserta y
acomoda punteros, caso contrario se parte el nodo en dos y sube el valor del medio. El paso es
recursivo hasta encontrar lugar o hasta llegar a la raz. Si all tampoco hay lugar, entonces la raz se
parte en dos y el valor del medio sube como nueva raz, aumentando el nivel del rbol. Como se
puede observar, el rbol crece hacia arriba y las hojas siempre permanecen al mismo nivel.

Como se puede apreciar, un rbol B es una estructura que mantiene un conjunto de datos
ordenado y permite realizar operaciones de bsqueda, insercin y borrado de manera eficiente. Sin
embargo, dicha estructura no permite un procesamiento secuencial eficiente de los datos, siendo
esta la mayor desventaja por no permitir bsquedas de rango.


Cantidad de registros
10
3
10
4
10
5
10
6
10
7

10 3 4 5 6 7
Claves en 50 2 3 3 4 4
el nodo 100 2 2 3 3 4
150 2 2 3 3 4

42 81
7 24 50 61 95 107
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

3
1.1.2. rbol B+

El rbol B+ es una variante del rbol B que justamente apunta a disminuir el costo del
procesamiento secuencial de los datos, mejorando el rendimiento de la operacin tomar el
siguiente. En un rbol B+, todas las referencias a los registros residen en las hojas del rbol,
mientras que los nodos internos guardan nicamente una copia de las claves de los registros. Los
niveles superiores, consisten nicamente de un ndice o mapa de los trayectos que permiten la
rpida ubicacin de un elemento en las hojas.

Naturalmente, los nodos del ndice y las hojas pueden tener distinto formato y tamao.
Particularmente, las hojas estn ligadas por una lista, de izquierda a derecha, aunque eventualmente
puede ser doblemente encadenada. Dicha lista se denomina el conjunto secuencial y facilita el
procesamiento secuencial de los datos.

Para apreciar completamente un rbol B+, se debe comprender las implicaciones de tener
un ndice y conjunto secuencial independientes. Consideremos por el momento una bsqueda: la
misma debe proseguir desde la raz del rbol, a travs del ndice, hasta una hoja. Como todos los
registros residen en las hojas, las claves encontradas durante el progreso de la bsqueda no son
significativas, siempre y cuando el trayecto conduzca a la hoja indicada.

El nodo raz es hoja cuando es el nico nodo y debe contener al menos un elemento. Debe
tener como mnimo 2 punteros a otros nodos cuando es interno.

Los nodos internos contienen entradas que consisten en un valor de referencia (copia de
una clave) y un puntero hacia otros nodos u hojas. Los punteros referencian caminos a seguir segn
sus valores sean menores, mayores o iguales al valor de referencia correspondiente.

Las hojas contiene entradas que pueden ser los registros mismos (ndice cluster), pares del
tipo (clave, rid) o pares del ipo (clave, lista_de_rid) y tiene un puntero extra que referencia la
prxima hoja en el orden del rbol.















Durante el borrado en un rbol B+, la oportunidad de dejar valores que no corresponden a
la clave de un registro como entradas en el ndice simplifica el procesamiento. El registro a ser
eliminado siempre debe residir en una hoja, por lo que su eliminacin es simple. Mientras la hoja
se mantenga llena al 50% como mnimo, el ndice no debe ser modificado, inclusive si una copia de
la clave se haba propagado hacia arriba. Claro est, si se produce una condicin de underflow, es
decir que la cantidad de entradas en el registro disminuye a menos de la mitad, los procesos de
redistribucin y concatenacin pueden requerir ajustar los valores del ndice, as como los de las
hojas, e inclusive pueden llevar a una reduccin en la altura del rbol.

bsqueda
aleatoria
bsqueda
secuencial
conjunto
secuencial
ndice
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

4
Las operaciones de insercin y bsqueda se procesan casi idnticamente como en el rbol
B. Cuando una hoja se divide en dos, en vez de promover la clave del medio, el algoritmo
promueve una copia de la clave, reteniendo la clave correspondiente en la hoja derecha. Por otra
parte, la operacin de bsqueda difiere de la del rbol B en que la bsqueda no se detiene si la
clave en el ndice es igual al valor consultado, sino que se continua el trayecto por el puntero
derecho ms prximo hasta encontrar una hoja.

Una variante de la insercin en rboles B+ es la llamada insercin con redistribucin que
consiste en no partir la hoja cuando se produce una condicin de overflow sin antes inspeccionar la
hoja siguiente para ver si en ella hay lugar, en cuyo caso se hace una redistribucin de claves en ese
nivel.

Por ejemplo, si se tuviera inicialmente el siguiente rbol B+












al realizar la insercin de una nueva tupla de clave 8 sin redistribucin, obtendramos un
crecimiento en profundidad:













En cambio, si realizramos esa misma insercin con redistribucin de claves, cmo la hoja
adyacente tiene espacio libre, el rbol no crecera en profundidad y slo se modificara la copia de
de la clave que era padre izquierdo de la hoja que modific su extremo izquierdo:











S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

5
En general, todas las operaciones sobre un rbol B+ son procesos de dos pasos: primero, se
debe ubicar la hoja apropiada para realizar la operacin; luego, se realiza el procesamiento
correspondiente. Encontrar la hoja apropiada para la operacin consiste en recorrer el rbol desde
la raz, comparando el valor de la clave de bsqueda con los valores almacenados en los nodos
interiores, y siguiendo los punteros correspondientes hasta alcanzar una hoja.

La implementacin de un rbol B+ mantiene el costo logartmico de un rbol B para
operaciones por igualdad y agrega la ventaja de bsqueda por rangos, donde ningn nodo ser
accedido ms de una vez, por lo que se necesitara nicamente espacio disponible para un nodo en
la memoria principal. Por lo tanto, los rboles B+ son estructuras muy apropiadas para aplicaciones
que demandan procesamiento de datos tanto aleatorio como secuencial.

Por todas las razones expuestas, muchas otras estructuras multinivel de ndice usan un
rbol B+ para su nivel inicial. Tambin es utilizado para generar ndices cluster, en cuyo caso las
hojas son los bloques mismos de la tabla, ordenados de acuerdo a la clave de bsqueda.

La carga masiva de datos en un ndice B+ se realiza a travs de los siguientes pasos:
1) Ordenar los datos en las pginas de disco (external sorting)
2) Crear la raz y apuntar a la primera pgina
3) Copiar la primera clave de cada pgina para ir creando B+ Tree




Ejemplo de I nserciones:
Se tiene el siguiente ndice ya creado











A continuacin insertaremos la clave 3300, que parte la hoja [2500, 3300, 4000] en dos,
subiendo como padre una copia de la clave 3300:












2100 2200 2500
2400
900
rid
1400
rid
2100
rid
2150
rid
2200
rid
2400
rid
2450
rid
2500
rid
4000
rid
2100 2200 2500 3300
2400
900
rid
1400
rid
2100
rid
2150
rid
2200
rid
2400
rid
2450
rid
2500
rid

3300
rid
4000
rid
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

6
Si luego se busca en dicho ndice la clave 2450, el camino a seguir es el siguiente:











El camino para acceder a todas las claves entre 2100 y 3300 es llegar a la clave 2100 y
luego seguir por la hojas hasta 3300, gracias a los punteros del conjunto secuencial.










Dado que la profundidad de un ndice rbol B+ depende de el nmero de ranuras que se
puedan almacenar en cada bloque de nodo interno, cuando las claves del ndice son de gran
longitud, como es el caso de cadenas de caracteres, se deben compactar para ocupar menos espacio.
Si se decide compactar usando un prefijo de string, hay que tener cuidado de elegir la cantidad
correcta de caracteres para evitar que la copia de la clave en el nodo interno resulte ambigua en la
posterior etapa de bsqueda, teniendo en cuenta que toda clave del subrbol izquierdo de una dada
debe ser menor y toda clave del subrbol derecho debe ser igual o mayor a ella y menor que la
clave que le sigue en el nodo.

Para asegurar estas condiciones en la compresin de claves, mientras se comprime una
determinada clave hacia su prefijo, se debe inspeccionar la mayor clave en el subrbol izquierdo y
la menor en el subrbol derecho que no coincida con las copias de claves vecinas en el nodo.


Ejemplo:
Supongamos el siguiente fragmento de ndice







2100 2200 2500 3300
2400
900
rid
1400
rid
2100
rid
2150
rid
2200
rid
2400
rid
2450
rid
2500
rid

3300
rid
4000
rid
2100 2200 2500 3300
2400
900
rid
1400
rid
2100
rid
2150
rid
2200
rid
2400
rid
2450
rid
2500
rid

3300
rid
4000
rid
pacto patria
paciencia
rid
paciente
rid
pacto
rid
pastoral
rid
patria
rid
patriota
rid
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

7
Para compactar la clave pacto nos fijamos en la clave mayor del subrbol izquierdo, que
es paciente y en la menor del subrbol derecho, que es pacto. Luego, el prefijo que se elija para
compactar pacto debe ser mayor que paciente y menor que pacto. Por lo tanto, la
compactacin debe ser pact. Notar que no serviran el prefijo pac ya que, frente a la clave
compactada, las palabras paciencia y paciente se buscaran en el subrbol derecho. Por el
mismo motivo, no sirve fijarse en las claves vecinas dentro del mismo nodo a la que se va a
compactar.

Anlogamente, el prefijo para compactar patria debe ser mayor que pastoral y menor
que patria, con lo cual la compactacin debe ser pat.


Finalmente el nodo compactado queda:












Por ltimo cabe aclarar que los duplicados en un rbol B+ pueden tratarse utilizando la
estrategia de ranuras tipo (clave, lista-de-Rids), generalmente implementada a travs de vectores
bitmaps, pero dicha escapa al alcance de este curso.



1.2. ndices con Tcnica de Hashing
La gran ventaja de la tcnica de hashing, para ser utilizada en un ndice, radica en el acceso
directo a la ranura deseada a travs de la aplicacin de una funcin matemtica que mapea claves
en un espacio de direccionamiento. Dado que un archivo puede crecer dinmicamente, para
solucionar las colisiones hay que utilizar una zona de overflow.

El problema de utilizar la tcnica de hashing esttico con zona de overflow es que las
cadenas auxiliares pueden crecer demasiado y bajar muchsimo el rendimiento del algoritmo de
bsqueda, que una vez encontrada la ranura debe navegar a lo largo de la cadena de overflow
buscando la clave deseada.

Para mantener la performance de la tabla de hashing dentro de lmites aceptables, la
solucin tradicional, cuando el porcentaje de ocupacin supera cierto umbral, es crear una nueva
tabla de hashing de mayor tamao y rehashear en ella todos los registros.

Dicha reorganizacin completa suele ser muy costosa y no puede realizarse on-line. Por
ese motivo han surgido distintas variantes del hashing esttico para utilizar con archivos que crecen
y decrecen dinmicamente. Las variantes ms conocidas son Extendible Hashing y Linear Hashing,
tcnicas que desarrollaremos en las dos secciones siguientes.



pact pat
paciencia
rid
paciente
rid
pacto
rid
pastoral
rid
patria
rid
patriota
rid
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

8
1.2.1. Extendible Hashing
En 1979, Fagin, Nievergelt, Pippenger y Strong presentan una variante llamada Extendible
Hashing, combinacin del hashing convencional con otra estructura de recuperacin de datos llama
trie.

El Extendible Hashing cuenta con dos estructuras bien diferenciadas: el directorio y los
bloques o buckets. El primero corresponde a un arreglo continuo en disco de profundidad d con
2
d
entradas. El mismo posee un encabezamiento donde figura la profundidad y est formado por
entradas que como mnimo deben tener un puntero a bloque. Los buckets tienen un encabezado que
como mnimo debe poseer la profundidad del mismo. Otros datos que pueden aparecer son la
cantidad de registros que posee el bucket, un puntero a una zona de overflow

Los registros del bucket poseen datos que varan en cada implementacin. Para esta
presentacin asumiremos que estn formados por pares del tipo (campo-clave, RID).

La profundidad del directorio se llama profundidad global (d) y la profundidad de cada
bucket es la profundidad local (d').

La funcin de hash a utilizar debe proporcionar una distribucin lo ms uniforme posible
para evitar desperdiciar espacio.

Una vez aplicada la funcin de hash, se deben elegir d bits del valor obtenido para
identificar la entrada correspondiente en el directorio. Si bien se pueden escoger los bits ms
significativos o los menos significativos, en la prctica se usan los ltimos d bits porque son los que
varan con mayor frecuencia, permitiendo as una mejor distribucin dentro de los buckets. Una vez
identificada la ranura en el directorio, se levanta el bucket correspondiente segn el puntero que
aparece en la misma.


















De acuerdo a lo explicado, se puede observar que con slo uno o dos accesos podemos
llegar a la tupla deseada. Debemos levantar primero el directorio a memoria (si es que no est an)
y luego el bucket correspondiente a la clave seleccionada. Dentro del bucket accedemos a todas las
tuplas que coinciden con nuestra clave buscada.

Para realizar la insercin de una clave, primero debemos ubicar el bucket a donde tenemos
que insertarla. Si en el mismo hay espacio para la nueva clave, se inserta el par correspondiente a
ella y a su RID, de acuerdo a la poltica de insercin (ordenado o desordenado). Si ya no hay
Estructura del Directorio
d
Entradas
o
Ranuras
d'
Cantidad de
Registros
Estructura del Bloque
Pares
(clave, RID)
Puntero a
zona overflow
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

9
suficiente lugar en el bucket, se debe crear uno nuevo y reorganizar las viejas claves junto a la que
se est insertando entre los dos bloques (el viejo y el nuevo) tomando un bit ms que lo que indica
el valor local d. Luego hay que acomodar los punteros necesarios en la entrada del directorio
correspondiente y la profundidad local de los dos buckets.

Si al agregar un nuevo bucket la profundidad local (d') del viejo bloque ya era igual a la
profundidad global del directorio (d), entonces ser necesario duplicar el tamao del directorio,
adems de crear un nuevo bucket, incrementando en uno la profundidad global.

Puede ocurrir que al hacer un split, los valores de hash de las claves sean tales que todas
coincidan en sus d+1 ltimos bits, razn por la cual uno de los bloques quedar vaco y el otro no
tendr lugar para albergar a la nueva clave. En ese caso se habilita el puntero de la zona de
overflow que deber indicar el bloque que es la extensin del actual. Obviamente, cuando
comienzan a aparecer muchas cadenas de stas, la cantidad de accesos se incrementa en la cantidad
de zonas de overflow que se tengan y la performance se ve degradada.

El borrado utiliza el camino inverso. Para realizar el borrado de una clave primero hay que
seleccionar el bucket donde se encuentra la clave a borrar. Al llegar al mismo se lo borra. Si el
bucket queda vaco luego del borrado, entonces se junta (merge) con el bucket cuyos d-1 bits
coincidan con los del bucket vaco, reduciendo en uno la profundidad local del bucket ya mezclado
y actualizando el puntero en la entrada correspondiente que apuntaba al antiguo bucket. Si la
profundidad de todos los buckets es menor a la profundidad global, el directorio se reduce a la
mitad, actualizndose los punteros de las entradas y disminuyendo en uno la profundidad global.

Generalmente se utiliza borrado lgico y el borrado fsico se realiza en la reconstruccin
del ndice, en en forma off-line.


Ejemplo:
Suponemos los siguientes valores de la funcin hash para las claves propuestas:

Clave Hash(Clave)
1200 00100101
1600 01000001
3100 01001100
1250 01111010
3200 01010011
2000 00101110
1800 01001111
1300 00101100
1000 00010111
1500 00111010


Comenzamos con el primer bucket vaco, con d = 0 y d' = 0. Insertamos las claves 1200,
1600, 3100 y 1250, que van al nico bucket habilitado:









0
0 4
3100
RID xxx
1250
1600
1200
RID xxx
RID xxx
RID xxx
NULL
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

10
Al insertar la clave 3200, encontramos que no hay ms lugar en ese bucket. Hay que dividir
el bloque, pero como d coincide con d, adems de agregar un nuevo bucket, hay que duplicar el
tamao del directorio. Luego se redistribuyen las claves, teniendo en cuenta el ltimo bit que indica
la funcin de hash (el nuevo d vale 1).





















Seguimos insertando las claves 2000, 1800 y 1300, que encuentran lugar en sus respectivos
buckes, con lo cual slo se actualizan los campos de cantidad de registros presentes:


















Cuando intentamos insertar la clave 1000, nuevamente hay que duplicar el directorio
porque la profundidad local del bucket a dividir (bloque de ranura 1) es 1 y coincide con la
profundidad global.

Notar que al duplicar el directorio, los buckets que no se dividieron son apuntados por 2
d-1

ranuras, ya que esas entradas no se necesitan usar d bits para diferenciarse sino los ltimos d- bits,
tal cual lo hacan antes de la divisin del bucket que hizo split.
1
1 2

RID xxx

1250
3100
RID xxx


NULL
1 3
3200
RID xxx

1600
1200
RID xxx
RID xxx

NULL
0
1
1
1 4
2000
RID xxx
1300
1250
3100
RID xxx
RID xxx
RID xxx
NULL
1 4
3200
RID xxx
1800
1600
1200
RID xxx
RID xxx
RID xxx
NULL
0
1
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

11




















Cuando intentamos insertar la clave 1500, vemos que no hay lugar en el bucket
correspondiente (ranura 10) pero si bien dividimos el bucket, no hay que duplicar el directorio
porque la profundidad local del bucket a dividir es menor a la profundidad global.

Por lo tanto, slo se crea un nuevo bloque y se redistribuyen las claves, tomando la
cantidad finales de bits indicada por el nuevo valor local, o sea, 2 bits:
2
1 4
2000
RID xxx
1300
1250
3100
RID xxx
RID xxx
RID xxx
NULL
2 2

RID xxx

1600
1200
RID xxx


NULL
00
01
10
11

2 3
1000
RID xxx

1800
3200
RID xxx
RID xxx

NULL
2
00
01
10
11

2 2
RID xxx
1300
3100
RID xxx
NULL
2 2
RID xxx
1600
1200
RID xxx
NULL
2 3
1000
RID xxx
1800
3200
RID xxx
RID xxx

NULL
2 3
1500
RID xxx
2000
1250
RID xxx
RID xxx
NULL
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

12
Dado que la profundidad local de todos los buckets es igual a la profundidad global, el
prximo bloque que se tenga que dividir ocasionar una duplicacin del directorio, que pasar a
considerar los ltimos 3 bits del valor de hasheo de las claves.

Entre las ventajas del Extendible Hashing encontramos la excelente performance para
bsqueda por igualdad que, de no exisitir zona de overflow, segn el directorio ya se encuentre
cargado en memoria o no.

Obviamente su ventaja se encuentra centrada en la bsqueda por igualdad, ya que no sirve
para bsquedas por rango. Por otra parte el tamao del directorio puede llegar a ser un gran cuello
de botella.


1.2.2. Linear Hashing

La tcnica de Linear Hashing fue desarrollada por Litwin en 1980. Una de sus ventajas
sobre otras variantes de hashing es la facilidad de su implementacin.

Comienza con N buckets y un espacio de direccionamiento que va desde 0 hasta N-1. En
vez de ampliar la tabla inmediatamente al doble de su tamao, se incrementa el espacio de
direccionamiento gradualmente mediante la expansin de los buckets en un orden preestablecido:
primero el bucket 0, luego el 1 y as sucesivamente hasta llegar al bucket N-1. En el mejor de los
casos, expandir un bucket involucra el movimiento de aproximadamente la mitad de los registros
de ese bucket a un nuevo bucket al final de la tabla. Para indicar el prximo bucket a ser
expandido se utiliza un puntero al mismo.

Cuando todos los N buckets ya han sido expandidos y el tamao de la tabla se ha
duplicado, se vuelve a colocar el puntero al principio de la tabla y el proceso vuelve a comenzar.,
pero esta vez el espacio de direccionamiento va desde 0 hasta el 2*N-1. Este proceso de expansin
sigue recursivamente mientras sea necesario.



La estructura bsica requerida es un arreglo de longitud variable, que crece y decrece segn
se necesite. En cada elemento del arreglo se guarda el identificador del bloque en donde se
guardan los pares (clave, Row ID) de los registros de ese bucket. En caso de que el bucket no entre
en un solo bloque se puede utilizar una zona de overflow de tantos bloques como sea necesario.

Se duplic la
tabla original
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

13
El estado actual de la tabla de hashing se identifica a travs de dos variables:
L, que indica el nmero de veces que la tabla se duplic respecto a su tamao inicial N
P, puntero al siguiente bucket a ser expandido

Directorio
p
N = 4 i = 0
0
1
2
3
4
Bucket
nro. de
bucket
(key, RID)
(key, RID)
(key, RID)
(key, RID)



A la hora de elegir la funcin de distribucin hay que considerar que los nmeros
generados presenten una distribucin uniforme. Un ejemplo de funcin mal elegida puede ser
H(k) = (A*K) mod N, donde A tenga factores comunes con el tamao de la tabla N.

En general, la funcin escogida tiene la forma de un generador de nmeros al azar
(determinstica), ya que este tipo de funciones son las que generan una distribucin uniforme.


Una buena opcin, muy usada y simple, consiste en tomar una funcin G que distribuya las
distintas claves en un intervalo [0, M], donde M es un nmero suficientemente grande (M > 2
20
).
Luego, para calcular la direccin de hashing se usa la siguiente funcin:

H
j
(K) = G(K) mod (N x 2
j
), con j = 0, 1, ...

donde N es el tamao inicial de la tabla de hashing.


Un posibilidad de buena performance para G es tomar funciones del tipo de los
generadores congruenciales de nmeros pseudoaleatorios:

G(K) = (C * K) mod M

donde C es una constante y M es un nmero primo.


Cada vez que la tabla expande un bucket, estas variables se actualizan de la siguiente
forma:

P++;

if( P == N x 2
L
)
{
L++;
P=0;
}


S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

14
En base al estado de la tabla, la direccin a donde hay que ir a buscar la clave K (y qu
funcin de hashing hay que usar) est dada por:

dir = H
L
(K);

if (dir < P)
dir = H
L+1
(K);


Es importante notar que siempre es necesario computar H
L
para saber si hay que utilizar
H
L+1
, pero nunca se necesitan funciones anteriores al nivel L.

El borrado utiliza el camino inverso, contrayendo la tabla de a un bucket por vez.
Obviamente se actualizan las variables de estado, todos los registros del ltimo bucket se mueven
al bucket apuntado por P y el ltimo bucket se libera.

Existen distintos criterios para decidir cundo expandir un bucket. El ms usado es trabajar
con un valor de ocupacin media llamado factor de carga (nmero de registros presentes en la tabla
dividido por el nmero de buckets). Se fijan un umbral mximo y otro mnimo, y la tabla se
expande o contrae cuando el factor de carga excede sendos lmites (un factor mayor al umbral
mximo implica expansin y un factor menor al umbral mnimo lleva a una combinacin).


Ejemplo:
Sea un tabla con espacio inicial N=5, con factor de carga =3 y funciones de la familia
H
j
(K)= K mod (N x 2
j
).

Se van a insertar las siguientes claves: 120, 29, 123, 345, 311, 606, 412, 434, 228, 78, 605,
607, 48, 97, 701, 127, 890 y 25.

Inicialmente, como el tamao de la tabla de hashing es de tamao 5, todos los
registros son hasheados por la funcin H
0
(K) = K mod 5.















Al insertar la calve 701, se lleg al lmite del factor de carga (15/5 3). Por lo tanto
hay que expandir el bucket apuntado por P, en este caso el 0. Una vez agregado el nuevo
bucket 5, se incrementa el puntero P y se redistribuyen las claves del bucket 0 segn la
funcin H
1
(K) = K mod 10.

0 1 4 3 2
120 311
606
701 605
345
412
607
97
123
78
228
48
29
434
L = 0
P = 0

S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

15
Si una clave hasheaba al 0 utilizando la funcin de hashing H
0
es porque su ltimo digito
resultaba ser 0 5. Utilizando la funcin de hashing H
1
, las claves cuyo ltimo dgito es 0 siguen
hasheando al bucket 0, mientras que las que terminan en 5 hashean al bucket 5. Notar que las
claves que hashean a los buckets 1, 2, 3 4 utilizando H
0
, no pueden hashear al bucket 5 cuando se
utiliza H
1
.













Luego seguimos insertando las claves y al llegar a la 25, nuevamente superamos el factor
de carga, pero en este caso expandimos el bucket 1, utilizando H
1
para la redistribucin de claves
entre ese bucket y el nueno bucket 6:














Cuando los 5 buckets iniciales ya se han expandido y el tamao de la tabla se ha duplicado
a 10, todos los registros se direccionarn mediante H
1
(K) = K mod 10 y los que se vuelvan a
expandir usarn la funcin H
2
(K) = K mod 20.

0 1 4 3 2
120 311
606
701
412
607
97
123
78
228
48
29
434
5
605
345
L = 0
P = 1

0 1 4 3 2
120 311 606
701
412
607
97
123
78
228
48
29
434
5
605
345
127
890
25
6
L = 0
P = 2

0 1 4 3 2
120 311
701
412
102
522

33
153
403
84
434
552
890
L = 1
P = 0

5 6 9 8 7
345 606
607
9
228
4
7
2
127
605
2
8 128
329
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

16
Obviamente, para buscar una clave se le aplica la funcin H
L
, correspondiente al nivel de
duplicaciones de la tabla y si hahsea a un bucket menor al lugar en donde se halla el puntero P,
entonces se le aplica la funcin H
L+1
, para deterctar si est en el bucket original o en su expansin.

I mportante

Todos los ndices basados en tcnica de hashing slo son ptimos para bsquedas por
igualdad, no sirviendo para bsquedas por rangos.



1.3. Ejercicio Global con Distintos ndices de Clave Simple
Para todos los ejemplos generaremos dos ndices sobre la siguiente tabla, uno sobre gasto y
otro sobre edad. Los tres campos son de tipo entero y el campo Legajo es la clave primaria de la
tabla.

GastoCliente GastoCliente
Legajo Edad Gasto Legajo Edad Gasto
1000 33 1200 1190 31 2800
1002 44 1600 1100 27 2450
1004 28 3100 1110 35 3500
1006 35 1250 1120 30 1800
1008 32 3200 1130 28 1000
1010 47 2000 1201 29 1850
1012 34 1800 1202 45 4200
1014 37 1300 1203 59 5800
1016 22 1000 1204 49 1700
1020 43 1500 1205 32 5000
1021 49 2000 1206 26 1900
1022 21 2400 1207 35 2200
1023 40 1400 1208 23 1550
1024 24 2500 1209 25 3100
1025 28 3000 1210 40 2000
1026 30 2900 1300 39 6200
1027 43 1400 1400 35 1500
1028 29 3800 1500 31 2100
1029 35 4000 1600 38 3200
1030 42 1350 1700 38 1700
1040 27 1900 1800 41 2450
1050 34 1600 1900 45 1300
1060 46 1350 2000 25 2300
1170 36 2500 2100 41 2150
1180 48 1600 2200 50 2200


Luego realizaremos las siguientes consultas, para comparar performance vs. gasto de
almacenamiento de cada estructura de ndice:
C1) Buscar los clientes cuyo gasto es igual a $ 2000
C2) Buscar los clientes cuyo gasto supera los $ 2000
C3) Buscar los clientes de 40 aos cuyo gasto sea de $ 2000
C4) Buscar los clientes cuyo gasto se encuentre entre $ 2000 y $5000
C5) Buscar los clientes entre 30 y 50 aos cuyo gasto se encuentre entre $ 2000 y $5000
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

17
Ejemplo con rbol B+

Suponemos que las hojas pueden contenrer hasta 3 pares (clave, RID) y que los nodos
internos pueden tener como mximo 2 entradas y 3 punteros a otros nodos, es decir un rbol de
orden 1. Por razones de espacio se ha omitido el valor RID de las hojas, que fue reemplazado por
un asterisco.


Indice sobre el campo GASTO


















C1) Buscar los clientes cuyo gasto es igual a $ 2000
Dado que 2000 est entre 1600 y 2400, se levanta el bloque indicado por el puntero medio
de la raz. Una vez ledo el nodo [1850, 2100] se vuelve a avanzar por el puntero central. En el
nodo [2000, - ] se elige el puntero a la derecha de 2000, ya que la igualdad se inclua de ese lado.
Finalmente se levantan las tres tuplas de valor 2000 referenciadas por el RID correspondiente en la
hoja.








1000 *
1000 *
1200 *


1250 *

1300 *
1300 *
1350 *
1350*
1400 *
1400 *

1500 *
1500 *
1550 *

1600 *
1600 *
1600 *

1700 *
1700 *


1800 *
1800 *


1850 *
1900 *
1900 *

2000 *
2000 *
2000 *

2100 *
2150 *


2200 *
2200 *
2300 *

2400 *


2450 *
2450 *
2500 *
2500*
2800 *
2900 *


3000 *
3100 *
3100 *

3200 *
3200 *
3500 *

3800 *
4000 *


4200 *
5000 *
5800 *
6200*
1250 1300
1700 1800 2450 2800 1500

2000

2200

3200

4200

1400 1850 2100 3000 3200
1600 2400
1000 *
1000 *
1200 *


1250 *

1300 *
1300 *
1350 *
1350*
1400 *
1400 *

1500 *
1500 *
1550 *

1600 *
1600 *
1600 *

1700 *
1700 *


1800 *
1800 *


1850 *
1900 *
1900 *

2000 *
2000 *
2000 *

2100 *
2150 *


2200 *
2200 *
2300 *

2400 *


2450 *
2450 *
2500 *
2500*
2800 *
2900 *


3000 *
3100 *
3100 *

3200 *
3200 *
3500 *

3800 *
4000 *


4200 *
5000 *
5800 *
6200*
1250 1300
1700 1800 2450 2800 1500

2000

2200

3200

4200

1400 1850 2100 3000 3800
1600 2400
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

18
C2) Buscar los clientes cuyo gasto supera los $ 2000
Se llega hasta la hoja que contiene el valor 2000, de la misma forma que en la bsqueda de
igualdad del punto anterior. A partir de all se navega por las hojas siguientes hasta dejar de
cumplir el rango buscado. En este caso se llega hasta la ltima hoja ya que el rango no est acotado
superiormente.











C3) Buscar los clientes de 40 aos cuyo gasto sea de $ 2000

Al no tener un ndice sobre el campo compuesto (edad, gasto), para responder esta consulta
buscamos la condicin de gasto 2000, igual que en la consulta C1, y una vez hallada la hoja
correspondiente, se levantarn todas las tuplas que cumplan la condicin del gasto buscado para
verificar si tambin cumplen con la edad 40.

Si se contara con otro ndice sobre el campo edad, se podra combinar la bsqueda anterior
con la bsqueda puntual de edad 40 y luego levantar las tuplas correspondientes a los RID de la
interseccin entre ambas hojas.


C4) Buscar los clientes cuyo gasto se encuentre entre $ 2000 y $5000

Se realiza igual que la bsqueda de rango de c2, slo que al tener una cota superior, la
bsqueda secuencial se detiene en la hoja cuyo valor supera el extremo.

En nuestro ejemplo se llegara tambin hasta la ltima hoja porque en ella se encuentra el
valor 5000, pero si se buscara un abolir anterior, como por ejemplo el 2400 se habran visitado
nada ms que 4 hojas.


C5) Buscar clientes entre 30 y 50 aos cuyo gasto se encuentre entre $ 2000 y $3000

La respuesta a esta consulta es una mezcla entre los procedimientos para resolver C2, por
tratarse de un rango, y C3, por tratarse de una consulta que involucra dos campos.
1000 *
1000 *
1200 *


1250 *

1300 *
1300 *
1350 *
1350*
1400 *
1400 *

1500 *
1500 *
1550 *

1600 *
1600 *
1600 *

1700 *
1700 *


1800 *
1800 *


1850 *
1900 *
1900 *

2000 *
2000 *
2000 *

2100 *
2150 *


2200 *
2200 *
2300 *

2400 *


2450 *
2450 *
2500 *
2500*
2800 *
2900 *


3000 *
3100 *
3100 *

3200 *
3200 *
3500 *

3800 *
4000 *


4200 *
5000 *
5800 *
6200*
1250 1300
1700 1800 2450 2800 1500

2000

2200

3200

4200

1400 1850 2100 3000 3800
1600

S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

19
Ejemplo con Extendible Hashing
A continuacin mostramos los valores obtenidos despus dela aplicacin de la funcin de
hash elegida, tanto para el campo gasto como para el campo edad:


Gasto H(Gasto) Edad H(Edad)
1000 1001 21 1011
1200 1010 22 100
1250 101 23 1
1300 1000 24 11
1350 0 25 1110
1400 1101 26 1101
1500 1011 27 1100
1550 1100 28 111
1600 11 29 10
1700 100 30 1000
1800 110 31 110
1850 1101 32 1000
1900 1110 33 1011
2000 10 34 100
2100 1101 35 0
2150 1 36 1100
2200 1 37 101
2300 0 38 1111
2400 1111 39 1101
2450 1001 40 11
2500 1100 41 1101
2800 110 42 11
2900 101 43 101
3000 1011 44 111
3100 100 45 1001
3200 101 46 110
3500 1000 47 1011
3800 1011 48 110
4000 1110 49 1010
4200 110 50 1110
5000 1100 59 101
5800 1110
6200 1


Suponemos una tamao de pgina con capacidad para 4 pares (clave, RID).

Despus de ingresar todas las tuplas y ordenar las claves dentro de los buckets
correspondientes, los ndices quedan como se muestra en las siguientes dos pginas:

S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

20
Indice sobre el campo GASTO

0
3
6
5
4
3
2
1
4
d
0000
0111
0110
0101
0100
0011
0010
0001
7
3
12
11
10
9
2
8
1000
1111
1110
1101
1100
1011
1010
1001
2 4
1600 RID
2400
RID
1600 RID
1600
RID
4 4
1900
RID
5800 RID
4000
RID
1900
RID
4 4
1400
RID
2100
RID
1850 RID
1400
RID
4 4
1550 RID
5000
RID
2500
RID
2500
RID
4 4
1500
RID
3800
RID
3000
RID
1500
RID
4 3
1300
RID
3500
RID
1300
RID
4 4
1000
RID
RID
2450 RID
1000
RID
4 4
1800
RID
4200 RID
2800
RID
1800
RID
4 4
1250 RID
3200
RID
3200
RID
2900 RID
4 4
3100
RID
RID
RID
3100
RID
3 4
2000
RID
RID
2000
RID 2000
RID
4 4
RID
2200
RID
2200
RID
2150
RID
4 3
1350
RID
2300
RID
1350 RID
0
1
12
11
10
9
8
7
6
5
4
3
2
1700
1700
1200
6200
2450
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

21
Indice sobre el campo EDAD
0
7
6
5
4
3
2
1
4 d
0000
0111
0110
0101
0100
0011
0010
0001
8
13
12
11
10
9
2
1
1000
1111
1110
1101
1100
1011
1010
1001
4 4
24 RID
42
RID
40 RID
40 RID
4 3
25 RID
50 RID
25 RID
4 4
26
RID
41 RID
41 RID
39 RID
4 3
27 RID
36 RID
27 RID
4 3
21 RID
47 RID
33 RID
4 4
28 RID
44
RID
28
RID
28
RID
4 4
30 RID
59
RID
32 RID
30
RID
4 4
31 RID
48 RID
46 RID
31 RID
4 3
34
RID
RID
RID
3 4
29
RID
RID 49
RID 49
RID
3 3
RID
45
45
RID
23
RID
4 4
37 RID
43
RID
RID
43 RID
0
1
12
11
10
9
8
7
6
5
4
3
2
34
22
29
32
4 2
38 RID
38 RID
13
4 5
35
RID
35 RID
35 RID
35 RID
35 RID


S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

22
Ahora realizamos las consultas:


C1) Buscar los clientes cuyo gasto es igual a $ 2000

Para realizar consultas por igualdad, como es este caso, un ndice hecho con extendible
hashing es muy eficiente porque con solamente 2 accesos logra obtener las tuplas deseadas.

En nuestro ejemplo, aplicamos H(2000)= 0010, to,mamos los ltimos d bits, entramos por
la ranura 0010 y vemos que las tuplas buscadas se encuentran en el bucket 2. Luego recorremos el
bucket para saber los RIDs de las tuplas cuyo gasto es de $2000.


C2) Buscar los clientes cuyo gasto supera los $2000

Para realizar consultas por rango tener un ndice hecho con extendible hashing no es muy
til. Porque si bien es fcil encontrar el $2000, al aplicarle la funcin de hashing el orden del
archivo se pierde totalmente. La opcin es recorrer todo el archivos ( o bien todos los buckets)
buscando las tuplas que cumplan la condicin del rango.


C3) Buscar los clientes de 40 aos cuyo gasto sea de $ 2000

Se trata de un consulta por dos igualdades, donde el extendible hashing es bastante
eficiente. Primero deberamos averiguar los RIDs de las tuplas con gasto $2000, esto es aplicar
H(2000) = 0010 y buscar dicha entrada en el ndice de GASTO, obteniendo el bucket 2. Luego
deberamos averiguar los RIDs de las tuplas con edad 40, esto es aplicar H(40) = 0011 y buscar
dicha entrada en el ndice de EDAD, obteniendo el bucket 3 de dicho ndice. Finalmente levantar
las tuplas de los RIDs que estn en la interseccin de ambas listas. Esta bsqueda obliga como
mnimo a realizar 4 accesos.

Si tuviramos un ndice sobre la concatenacin de los campos, podramos disminuir la
cantidad de accesos a dos, pero luego no nos servira para bsquedas de alguno de dichos campos
por separado.


C4) Buscar los clientes cuyo gasto se encuentre entre $ 2000 y $5000

Esta es una consulta de rango como la C2. Como ya se explic previamente, extendible
hashing no es til para este tipo de consultas. Por lo tanto, se aplican las mismas opciones de
solucin que en C2.


C5) Buscar los clientes entre 30 y 50 aos cuyo gasto se encuentre entre $ 2000 y $5000

Esta es una consulta por rango y encima sobre dos campos, esto sera lo peor para
extendible hashing. Pasa lo mismo que en las consultas C2 y C4.

S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

23
Ejemplo con Linear Hashing
Elegimos la funcin g(k) = ( (3 + 8 * 234237) * k) mod 1048583, que ofrece una buena
distribucin de las claves.

En base a la funcin g, aseamos las claves segn h
L
( g(k) ) = g(k) mod ( N * 2
L
)

Lo ideal para N es tomar la cantidad mnima de tuplas a insertar divido por la cantidad de
tuplas por bucket, pero en nuestro caso elegimos N = 4 slo para tener varias duplicaciones en la
longitud.

Aplicando estas funciones al campo gasto, obtenemos los siguientes valores:
























El formato de las pginas es el siguiente:

5
4
1200 RID
2500 RID
2670 RID


2
1200 RID
2500 RID



Por simplicidad hemos obviado la estructura del directorio.

Gasto g(Gasto) 0 1 2 3
1200 516848 0 0 0 16
1600 339603 3 3 3 19
3100 985663 3 7 15 31
1250 887911 3 7 7 7
3200 679206 2 6 6 6
2000 162358 2 6 6 22
1800 775272 0 0 8 8
1300 210391 3 7 7 23
1000 81179 3 3 11 27
1500 646060 0 4 12 12
2000 162358 2 6 6 22
2400 1033696 0 0 0 0
1400 952517 1 5 5 5
2500 727239 3 7 7 7
3000 243537 1 1 1 17
2900 549994 2 2 10 10
1400 952517 1 5 5 5
3800 937630 2 6 14 30
4000 324716 0 4 12 12
1350 581454 2 6 14 14
1900 468815 3 7 15 15

mod 4
mod 8
mod 16
Cantidad de entradas
en el bucket
Puntero a bucket
de overflow
Bucket de overflow
del bucket 5
Bucket 5
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

24
Indice sobre el campo GASTO

(N= 4, = 3)

























16
3 X
1200 RID
2450 RID
2450 RID




Habiendo insertado todas las tuplas llegamos al estado final L = 2, p = 1.



1 X 2 X 2 X 3 2 X 2 X 3 3
2400 RID 3000 RID 3500 RID 1600 RID 2100 RID 1400 RID 3200 RID 1250 RID
4200 RID 2300 RID 1600 RID 2150 RID 1400 RID 2000 3.0 1300 RID
1600 RID 2000 5.1 2500 RID
2 X 2 X 3
2800 RID 2000 12.1 2500 RID
1550 RID 3200 RID 5000 RID
6200 RID
1 X
1300 RID
p
0 1 2 3 4 5 6 7
3 X 0 X 3 X 3 3 X 1 X 3 X 3 X
1800 RID 2900 RID 1000 RID 1500 RID 5800 RID 3800 RID 3100 RID
1800 RID 1700 RID 1000 RID 4000 RID 1350 RID 1900 RID
1850 RID 1700 RID 2200 RID 1500 RID 1350 RID 1900 RID
1 X 1 X
2200 RID 3100 RID
10 11 8 9 12 13 14 15
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

25
Indice sobre el campo EDAD

(N= 4, = 2.5)





Habiendo insertado todas las tuplas llegamos al estado final L = 2, p = 4.


De las consultas solicitadas slo aplicaremos C1 y C3, ya que las otras son de bsquedas
por rango, para lo cual un ndice con tcnica de hashing no tiene sentido.


1 X 2 X 2 X 0 X 3

3 X 3 X 3

47 RID 22 RID 44 RID 21 RID 33 RID 28 RID 40 6.1
42 RID 24 RID 31 RID 43 RID 28 RID 30 RID
31 RID 43 RID 28 RID 30 RID
2 X 2 X
41 RID 40 12.1
41 RID 50 RID
4 5 6 7 0 1 2 3
p
0 X 3 X 3 0 X 3 X 3 X 1 X 3
37 RID 49 RID 46 RID 48 RID 23 RID 35 RID
27 RID 29 RID 36 RID 38 RID 35 RID
27 RID 29 RID 26 RID 38 RID 35 RID
3 X 3
49 RID 45 RID
59 RID 35 RID
39 RID 25 RID
3 X
35 RID
45 RID
25 RID
8 9 10 11 12 13 14 15
0 X 2 X 2 X 0 X
32 RID 34 RID
32 RID 34 RID
16 17 18 19
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

26
C1) Buscar los clientes cuyo gasto es igual a $ 2000

Para acceder a las tuplas requeridas, primero obtenemos mediante la funcin de hash el
bucket donde ha de encontrarse la referencia:


Dado que al aplicar la funcin de hash para L = 2 obtuvimos un valor mayor que p (6 > 1)
no hay necesidad de volver a aplicar la funcin de hash. Con lo cual procedemos a leer el bucket
correspondiente de la tabla y realizamos una bsqueda secuencial del key solicitado:

Las referencias que machean son:

Ahora levantamos del archivo de datos los bloques indicados por la columna RID y leemos
de cada uno la tupla indicada.:


C3) Buscar los clientes de 40 aos cuyo gasto sea de $ 2000

Dado que en la consulta anterior hemos buscado aquellos clientes cuyo gasto es igual a
$2000, basta con encontrar los clientes de 40 aos. Para lo cual utilizamos el ndice sobre el campo
edad. Nuevamente el primer paso a realizar es el de calcular el nmero de bucket donde se
encontrar la referencia a las tuplas buscadas mediante la funcin de hasheo:



Aqu el valor nuevamente es mayor a p (7 > 4) con lo cual basta con recurrir al bucket 7 de
la tabla para levantar los valores que coincidan con el criterio de bsqueda:


Halladas las referencias de clientes con edad igual a 40, basta con hallar la interseccin con
los RID de las referencias a tuplas cuyo gasto es igual a 2000:



Finalmente levantamos las tuplas de os RIDs de la interseccin.
Gasto g(Gasto) 0 1 2
2000 162358 2 6 6
Gasto RID
2000 3.0
2000 5.1
2000 12.1
Edad g(Edad) 0 1 2
40 506567 3 7 7
Gasto RID
2000 3.0
2000 5.1
2000 12.1
Edad RID
40 6.1
40 12.1
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

27
2. ndices de Claves Compuestas

Cuando se quiere hacer una consulta que involucra la conjuncin de condiciones sobre
varios campos, aunque se tengan ndices simples sobre dichos campo los motores no siempre los
utilizan.

Para optimizar dicho tipo de consulta compuesta hay que crear un nico ndice compuesto
usando como clave de bsqueda la concatenacin de todas las claves sobre las que se quiere
construir el ndice, tomadas en un cierto orden. Luego, tanto para la construccin como para las
posteriores bsquedas, se utilizar el prefijo de la concatenacin en el mismo orden elegido
inicialmente.



2.1. rbol B+de Claves Compuestas

A modo de ejemplo, mostramos un ndice rbol B+ sobre una clave mltiple formada por
edad y gasto obtenido a travs de la clave prefijo edad: se ordena por el campo edad y a igualdad
de edad se utiliza el campo que sigue, en este caso gasto.














Como se puede observar, todas las bsquedas sobre el total de las claves
involucradas en el ndice podrn responderse rpidamente utilizando el ndice, que buscar
la hoja correspondiente guindose por el prefijo edad:

Select *
From Gasto_mensual
Where edad = 28 AND gasto = 3100


Si slo se consultara por el prefijo edad, el ndice compuesto sera tambin muy
til, ya que en su construccin dicho prefijo fue utilizado para guiar el orden de
construccin del ndice compuesto:

Select *
From Gasto_mensual
Where edad = 28

28#3100 33#1200 44#1600 47#2000
35#1250
28#3100 33#1200
28#3100 33#1200
44#1600 47#2000
44#1600 47#2000
35#1250
35#1250
21
2400
22
1000
28
3100
32
3200
33
1200
34
1800
35
1250
37
1300
44
1600


47
2000
49
3100
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

28
Sin embargo no servira de nada el ndice si la consulta involucra parte de la clave
compuesta que no resulta ser un prefijo de la misma, ya que el orden de construccin no se
bas en ella:

Select *
From Gasto_mensual
Where gasto = 3100


Notar que el orden de los campos en la creacin del ndice es muy importante a la hora de
usarlo en forma parcial, ya que slo puede servir para bsquedas en la totalidad de los campos de la
clave compuesta o en sublistas prefijas de la misma.



2.2. rbol KD (KD-Tree)
La estrategia de indexacin del k-d Tree utiliza como base un rbol binario de bsqueda,
adaptado pata realizar bsquedas de datos multidimensionales. Para ello se divide el rbol en
niveles, cada uno de los cuales contiene nodos con valores de una de las dimensiones que
componen la clave mltiple. La asignacin del atributo a usar en cada nivel se realiza utilizando
algoritmo Round Robin sobre el total de atributos de la clave compuesta.


2.2.1. Creacin de un ndice KD-Tree

Supongamos una clave de bsqueda formada por M atributos: (A
1
, A
2
, A
3
, A
M
).
Inicialmente, todos los datos son almacenados en un solo bucket hasta que alcance el mximo de
capacidad.

Una vez que el bucket alcanza el mximo de capacidad, un intento de insercin provoca la
divisin del bucket en 2, con la creacin de un nodo interno. Para este propsito, una lnea de
separacin (imaginaria) es determinada y los objetos de cada lado de la lnea son almacenados en
sendos buckets. El atributo a utilizar en esta separacin ser llamado A
i
con i=1. Generalmente para
la separacin se elige la media entre los valores presentes y el que se est insertando.

Se siguen realizando inserciones, guiadas por el atributo A
1
. Cuando se complete el
prximo bucket, el mismo ser dividido en dos utilizando como criterio el atributo que siga en la
clave, es decir A
2
.

Este proceso se repite, utilizando en la apertura de cada nuevo bucket el atributo A
i+1 mod M
donde A
i
es el atributo usado para la divisin del nivel anterior.

Para solucionar el problema de duplicados que completen un bucket y que correspondan al
atributo de divisin de ese nivel (con lo cual todos los duplicados volveran a quedar en un mismo
bucket) se pueden aplicar dos tcnicas: zona de overflow con lista linkeada o eleccin de otro
atributo para la divisin.




S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

29
Ejemplo:
Sea una tabla que contiene, entre otros campos, gasto y edad. Vamos a construir un ndice
KD-Tree sobre la clave (edad, gasto).












Considerando que la capacidad de cada bucket es de dos registros y comenzamos en el
primer nivel con la divisin por el campo edad.

Insertamos las dos primeras claves:






Al intentar insertar [28, 3100] se divide el bucket. Como estamos en el
primer nivel del rbol, el valor de separacin es sobre el campo EDAD:










Para la insercin de la prxima clave se compara el valor del campo edad, y como es
mayor o igual al valor del nodo, se inserta en el bucket de la derecha:










Al intentar insertar [32, 3200] se divide el bucket de la izquierda. Como en este caso
estamos en un segundo nivel del rbol, el valor de separacin del nodo es sobre el campo GASTO.


EDAD GASTO
33 1200
44 1600
28 3100
35 1250
32 3200
47 2000
49 2000
37 1300
39 1500
33 1200
44 1600
Lnea de separacin: es el promedio de edades

33 1200
44 1600
28 3100
Edad 35
44 1600
33 1200
28 3100
35 1250
Edad 35
44 1600 33 1200
28 3100
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

30




















La insercin del sexto registro [47, 2000] se hace comparando el valor del campo edad.
En nuestro caso, se desciende por derecha y como el bucket ya estcompleto hay que separarlo
utilizando el campo gasto:





























Lnea de separacin: promedio de GASTO
32 3200
35 1250
Edad 35
44 1600 33 1200
28 3100
Edad 35
28 3100 33 1200
Gasto 2500
32 3200
35 1250
44 1600
Lnea de separacin: promedio de GASTO
Edad 35
28 3100 33 1200
Gasto 2500
32 3200
35 1250
44 1600
47 2000
33 1200 28 3100
32 3200
Edad 35
Gast.2500 Gast.1617
44 1600
35 1250 47 2000
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

31
La insercin del sptimo registro se hacea comparando en el ptimer nivel por edad (bifurca
a derecha) y en el Segundo nivel pro gasto (bifurca a derecha):
















La insercin del registro [37, 1300] obliga a una nueva divisin. Debido a que estamos en
un tercer nivel y ya se usaron todos los campos para criterios de separacin, nuevamente se retoma
la divisin por edad:





























33 1200 28 3100
32 3200
Edad 35
Gast.2500 Gast.1617
44 1600
35 1250 47 2000
49 2000
33 1200 28 3100
32 3200 44 1600
35 1250 47 2000
49 2000
37 1300
Edad 35
Gast.2500 Gast.1617
Edad 35
Gast.2500 Gast.1617
Edad 39
33 1200 28 3100
32 3200
47 2000
49 2000
44 1600
35 1250
37 1300
Lnea de separacin: promedio de GASTO
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

32
La insercin del ultimo registro no produce aparicin de nuevos buckets, ya que
hay suficiente lugar en el bloque:
















En la implemetacin real se puede llegar a producir un alto grado de desbalance, en cuyo
caso hay que hacer una reorganizacin off-line.

Para mejorar el crecimiento en profundidad, tpico de los rboles binarios, se suele utilizar
la estrategia de los rboles B+, colocando varios nodos internos en un mismo bloque de disco,
aunque eso dificulte un poco el algoritmo de bsqueda.



2.2.2. Bsquedas en un KD-Tree
Bsqueda Total Puntual

Se usa el mismo algoritmo de la bsqueda binaria, pero en cada nivel se pregunta por el
atributo que corresponda. La nica forma de saber si el nodo buscado est presente o no es llegando
hasta las hojas. Se trata del mejot caso de bsqueda para un KD-Tree.

Ejemplo
Select *
From Clientes
Where edad= 40 and gasto = 2000












Edad 35
Gast.2500 Gast.1617
Edad 39
33 1200 28 3100
32 3200
47 2000
49 2000
44 1600
35 1250
37 1300
39 1500
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

33
Bsqueda Total por Rangos

Es anloga a la bsqueda puntual, pero en cada nodo hay que ver si se contina por un solo
subrbol o por los dos, segn el rango completo est o no contenido en una rama.

Ejemplo
Select *
From Clientes
Where edad > 30 and edad < 50 and gasto > 2000 and gasto < 5000

















Bsqueda Parcial Puntal

La prdida de eficiencia se presenta cuando se est en un nivel donde el valor de atributo
no est especificado en la bsqueda: Hay que buscar s o s en las dos subramas de dicho nodo.

Ejemplo
Select *
From Clientes
Where gasto = 2000
















S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

34
Bsqueda Parcial por Rango

En cada nivel de un atributo no especificado hay que buscar en las dos subramas y en cada nivel de
un atributo especificado en la bsqueda hay que estudiar si se contina por los dos subrboles o por uno
slo, segn el rango solicitado.

Ejemplo
Select *
From Clientes
Where gasto > 2000 and gasto < 2400


















2.3. ndice GridFile
El mtodo usado por este ndice se basa en la particin del espacio de los atributos que
forman la clave del ndice en forma dinmica, que con el uso de un directorio asegura un mximo
de dos accesos para bsquedas puntuales. Las claves se organizan en forma simtrica, de manera tal
que no hay distincin entre ellas (no hay prefijos).

En general este tipo de ndice se adapta especialmente al caso de un nmero pequeo de
atributos pero cuyo dominio sea grande, pero sin correlaciones entre sus atributos.

Los ndices GridFile cumplen dos premisas bsicas:
1. Principio de los dos accesos a disco: Una bsqueda totalmente especificada debe poder
retornar la tupla requerida accediendo al disco un mximo de dos veces. El primer acceso es
para obtener un directorio que le permita obtener la tupla deseada en un segundo acceso.
2. Bsquedas de rango eficientes con respecto a todos los atributos: La estructura de
almacenamiento debe preservar lo mejor posible el orden definido por el dominio de cada
atributo, de manera tal que las tuplas que se encuentran cerca unas de otras en los bloques
fsicos del disco, tambin sean cercanas en el dominio de sus atributos.


S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

35
En lugar de organizar el conjunto especfico de los datos, como hacen los rboles de
bsqueda binaria, un GridFile organiza el espacio del cual provienen los datos a travs de lmites
colocados en lugares fijos, independientemente del contenido del archivo. La actualizacin
dinmica se realiza mediante activacin o desactivacin de dichos lmites.

La utilidad del sistema de particionamiento depende de la distribucin de los datos. En
definitiva, los atributos correlacionados, o sea funcionalmente dependientes uno de otro (por
ejemplo edad y fecha de nacimiento) atentan contra la utilizacin total del poder de discriminacin
de las particiones en forma de grilla. Pero este detalle se salva eligiendo apropiadamente los
atributos de bsqueda, dejando de lado los correlacionados. Por esta razn el sistema Grid File
asume atributos independientes. Como consecuencia de la decisin en la forma de particionamiento
se consiguen limitacin sistemtica de regiones y economa en la representacin.

A modo de ejemplo, si el espacio de los registros es S = X * Y * Z, se realiza la particin
P = U * V * W, imponiendo los intervalos U = (u
0
, u
1
, ..., u
l
), V = (v
0
, v
1
, ..., v
m
), W = (w
0
, ..., w
n
)
en cada eje y dividiendo el espacio en bloques de grilla o grid blocks como se muestra en la
siguiente figura:










La estructura con que se guardan las tuplas dentro de un bloque no es relevante. Con un
sencillo almacenamiento secuencial se consiguen buenos resultados. Un aspecto importante es
tratar de mantener una alta ocupacin de esos bloques.
La estructura de un GridFile consiste en un directorio de grilla, encargado de mantener la
relacin entre bloques y grid blocks. Este directorio est formado por un arreglo K-dimensional
llamado grid array y K arreglos unidimensionales llamados linear scales, cuyas componentes son
punteros a los bloques en disco. A travs el directorio se localiza el bloque en disco que
corresponde a los parmetros de bsqueda solicitados.








Linear
Scales
Grid Array
Grid Block
Bucket


S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

36
La cantidad de componentes es determinada dinmicamente de acuerdo al nmero de
particiones actuales del espacio de datos. Los arreglos unidimensionales, o linear scales, son
ndices a los lmites de cada uno de los grid blocks. Corresponde un linear scale por cada eje de
coordenadas del grid array. La cantidad de elementos de cada uno de los arreglos unidimensionales
es igual a la cantidad de elementos en cada una de las coordenadas del grid array ms uno.

Para obtener con la mayor rapidez posible una respuesta a las consultas, los linear scales
deben residir en memoria. En cambio, el grid array puede estar en disco y levantarse la zona
necesaria a la hora de realizar una consulta (sera el primero de los dos accesos a disco).

Entre las decisiones de diseo a adoptar, una de las ms importantes es la estructura interna
del grid directory. En una primera aproximacin parece que las listas linkeadas son candidatas
perfectas para ser utilizadas ya que las inserciones y los borrados pueden ocurrir en posiciones
arbitrarias y se requieren pocas operaciones para su realizacin. Sin embargo analizando con mayor
profundidad, requieren cadenas transversales de punteros para buscar los elementos pedidos y el
acceso rpido a los mismos slo es garantizado si estas cadenas residen en el mismo bloque de
disco. La otra desventaja de las listas es la duplicacin de espacio requerido debido a los punteros.
Como segunda opcin, se puede utilizar un arreglo de k dimensiones. Su tamao es determinado
por la cantidad de elementos de cada linear scale. Su ventaja es la velocidad y su desventaja
radica en que, ante eventuales datos no uniformes, se desperdicia espacio de almacenamiento. Pero
puede residir en disco y ser accedido por zonas por demanda (figura 4.1).

Las polticas de divisin y combinacin no resultan ser tan relevantes ya que se supone que
las inserciones y borrados ocupan una parte menor durante la vida del sistema. Existen varios
mtodos compatibles y ms eficientes para cada situacin en particular. En nuestro caso particular
utilizamos una tcnica de seleccin alternativa, particionando sucesivamente en cada una de las
dimensiones del espacio de datos.

El problema de varias tuplas cuyos campos claves estn repetidos y excedan la capacidad
de un bloque de disco, no representa un problema, siempre que se disee el sistema de manera tal
de permitir ms de un grid block con el mismo lmite superior. Entonces las bsquedas en los
linear scales deberan retornar un conjunto de grid blocks que contengan a las tuplas con igual
clave, al retornar como ndices los comprendidos entre el lmite inferior y el ltimo ndice superior
(si hay ms de uno con el mismo valor).


2.3.1. Creacin de un ndice GridFile
Supongamos bloques con una capacidad mxima para tres claves. Las inserciones se van
haciendo en los bloques. Inicialmente hay un solo bloque al cual se le asigna todo el espacio de
datos:








A
Espacio de datos
Directorio
B
C
(A,*) (B,*) (C, *)
A
Espacio de datos
Directorio
B
C
(A,*) (B,*) (C, *)
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

37
Cuando el bloque es desbordado, el espacio de los datos es dividido y se utiliza un nuevo
bloque. Los registros que yacen en la mitad derecha del espacio, son movidos al bloque nuevo. Los
restantes quedan en el bloque inicial.











Si el primer bloque se se desborda nuevamente, su grid block se divide de acuerdo a cierta
poltica de divisin, que generalmente es alternar direcciones (usando Round-Robin sobre la lista
de atributos de la clave compuesta). Aquellos registros del bloque nuevamente desbordado que
estn en el grid block de la parte inferior-izquierda del grid array, son movidos a un nuevo tercer
bloque. El bloque que no se desbord queda sin cambios.










Si llegan ms tuplas a la parte inferior-derecha del espacio de datos y el bloque
correspondiente se desborda, se producir un nuevo refinamiento.








A
Espacio de datos
B
C
D
Directorio
(A,*) (B,*) (C,*) (D,*)
A
Espacio de datos
B
C
D
Directorio
(A,*) (B,*) (C,*) (D,*)
Espacio de datos
A
B
C
D
Directorio
(B,*) (F,*) (C,*) (D,*)
E
F
(A,*) (E,*)
Espacio de datos
A
B
C
D
Directorio
(B,*) (F,*) (C,*) (D,*)
E
F
(A,*) (E,*)
A
Espacio de datos
B
C
D
Directorio
(B,*) (F,*) (C,*) (G,*) (H,*)
E
F
(A,*) (E,*)
G
H
(D,*)
A
Espacio de datos
B
C
D
Directorio
(B,*) (F,*) (C,*) (G,*) (H,*)
E
F
(A,*) (E,*)
G
H
(D,*)
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

38
Ejemplo
Crearemos un ndice GridFile sobre los campos edad y gasto de la siguiente tabla,
suponiendo una capacidad de 2 tuplas por bloque.

La estrategia de particin ser la secuencia alternativa de campos, comenzando por edad,
eligiendo como poltica de divisin particionar en el lugar del elemento que deja igual cantidad de
puntos de un lado y del otro, considerando que el elemento divisiorio pertence a la particin
superior o a la izquierda.

Legajo Edad Gasto Legajo Edad Gasto
1000 33 1200 1190 31 2800
1002 44 1600 1100 27 2450
1004 28 3100 1110 35 3500
1006 35 1250 1120 30 1800
1008 32 3200 1130 28 1000
1010 47 2000 1201 29 1850
1012 34 1800 1202 45 4200
1014 37 1300 1203 59 5800
1016 22 1000 1204 49 1700
1020 43 1500 1205 32 5000
1021 49 2000 1206 26 1900
1022 21 2400 1207 35 2200
1023 40 1400 1208 23 1550
1024 24 2500 1209 25 3100
1025 28 3000 1210 40 2000
1026 30 2900 1300 39 6200
1027 43 1400 1400 35 1500
1028 29 3800 1500 31 2100
1029 35 4000 1600 38 3200
1030 42 1350 1700 38 1700
1040 27 1900 1800 41 2450
1050 34 1600 1900 45 1300
1060 46 1350 2000 25 2300
1170 36 2500 2100 41 2150
1180 48 1600 2200 50 2200


De acuerdo a los valores lmites para cada campo, se generan los linear scales:


Luego se genera el grid array de 2 dimensiones, apuntando al primer bloque en disco:









Al insertar las dos primeras tuplas se obtiene un directorio de slo una entrada que apunta
al nico bloque existente:
21 59 Edad:
1000 6200 Gasto:
b0 Edad
Gasto
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

39






















Al insertar la tercer tupla se produce una particin dado que el bloque ya est lleno:
























La insercin de la cuarta tupla es directa al bloque 1, pero no genera particin porque ste
tiene lugar.

1002 44 1600 T2:
21 59 Edad:
1000 6200 Gasto:
b0 Edad
Gasto
0
0
T1
T2
DISCO:
b0 b1 b2 b3 b4 b5
1004 28 3100 T3:
21 33 Edad:
1000 6200 Gasto:
b0
Edad
Gasto
0
0
T1
T3
T2 DISCO:
b0 b1 b2 b3 b4 b5
b1
59
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

40
La quinta tupla genera una nueva particin, pero ahora (por decisin de diseo) en el eje de
los gastos.



























En la siguiente figura se muestra como queda el espacio de los datos luego de realizar las
primeras 25 inserciones.





















1000
1500
2000
2500
3000
3500
4000
4500
5000
5500
6000
21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59
Edad
G
a
s
t
o
1008 32 3200 T5:
21 33 Edad:
1000 3100 Gasto:
b0
Edad
Gasto
0
1
T1
T3
T2
T4
T5 DISCO:
b0 b1 b2 b3 b4 b5
b1
59
b2
b3
6200
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

41
El ndice finalizada la insercin de las primeras 25 tuplas tiene la siguiente estructura:

Grid Array










Linear Scale GASTO



Linear Scale EDAD




Distribucin de las tuplas en disco











2.3.2. Bsquedas en un GridFile
Para acceder a un registro en particular, se procede de la siguiente manera:
1. Se busca en el linear scale correspondiente al campo de bsqueda la posicin del grid block en
el grid array.
2. Con los ndices obtenidos anteriormente se encuentra en el grid array el bloque al cual apunta
el grid block.
3. Se realiza una bsqueda secuencial dentro del bloque para encontrar la tupla deseada.









1000 1400 1500 1600 2400 3000 6200 3100 3800
21 28 33 35 40 44 47 59
Gasto
Edad
b0
T1
T9
b1
T4

b5
T13
T8
b9
T12
T21
b4
T7
T22
b2
T5
T18
b3
T25
T11
b8
T20
T17
b7
T15
T14
b6
T2
T6
b10
T3

b11
T16

b15 b19
T24
b14 b12

b13
T19
b18

b17
T23
Bucket
Select .
Where a1= and a2=
Bucket
Select .
Where a1= and a2=
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

42
Bsqueda Total Puntual

Se accede usando todos los linear scale para encontrar el grid block correspondiente. Si no
se encuentra en memoria, se lo levanta para inspeccionar sus tuplas en busca de las que cumplan la
condicin.

Ejemplo
Select *
From Clientes
Where edad= 29 and gasto = 3800
























En nuestro caso se levanta el bloque b2 de disco y se encuentra que la tupla 18 de la tabla
cumple con la condicin pedida:











0 1 2 3 4 5 6 7
0 b0 b14 b14 b9 b7 b10 b2 b13
1 b12 b12 b12 b12 b11 b10 b2 b13
2 b1 b1 b4 b4 b4 b4 b2 b13
3 b5 b15 b6 b6 b19 b19 b2 b13
4 b8 b16 b6 b6 b19 b19 b2 b13
5 b17 b16 b6 b6 b19 b19 b18 b13
6 b3 b3 b3 b3 b3 b3 b3 b3
1000 1400 1500 1600 2400 3000 6200 3100 3800 Gasto::
21
28
33
35
40
44
47
59
Edad:
Gasto = 3800; Edad = 29
i = 6
j = 1
b2
T5
T18
1008 32 3200 T5:
1028 29 3800 T18:
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

43
Bsqueda Total por Rangos

Se accede usando todos los linear scale para encontrar el grid block correspondiente. Si no
se encuentra en memoria, se lo levanta para inspeccionar sus tuplas en busca de las que cumplan la
condicin..


Ejemplo
Select *
From Clientes
Where edad > 30 and edad < 50 and gasto > 2000 and gasto < 5000
























Luego se realiza la bsqueda de tuplas en los bloques b2, b3, b4, b6, b10, b11, b12, b13,
b18 y b19, hallando como respuesta las tuplas marcadas en la figura:






0 1 2 3 4 5 6 7
0 b0 b14 b14 b9 b7 b10 b2 b13
1 b12 b12 b12 b12 b11 b10 b2 b13
2 b1 b1 b4 b4 b4 b4 b2 b13
3 b5 b15 b6 b6 b19 b19 b2 b13
4 b8 b16 b6 b6 b19 b19 b2 b13
5 b17 b16 b6 b6 b19 b19 b18 b13
6 b3 b3 b3 b3 b3 b3 b3 b3
1000 1400 1500 1600 2400 3000 6200 3100 3800 Gasto::
21
28
33
35
40
44
47
59
Edad:
2000 Gasto 5000
30 Edad 50
3 i 7
1 j 6
1008 32 3200 T5:
1028 29 3800 T18:
1180 48 1600 T25:
1021 49 2000 T11:
1002 44 1600 T2:
1010 47 2000 T6:
1012 34 1800 T7:
1050 34 1600 T22:
1004 28 3100 T3:
1026 30 2900 T16:
1029 35 4000 T19:
1170 36 2500 T24:
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

44
Bsqueda Parcial Puntual

Se accede slo a los linear scale de los atributos especificados en la consulta y para las
entradas puntuales de ellos se levantan todas las entradas de los linear scale de los atributos
ausentes.

Ejemplo
Select *
From Clientes
Where gasto = 2000























Buscando los bloques apuntados:







Se realiza la bsqueda por todas las tuplas de cada uno de los bloques:










0 1 2 3 4 5 6 7
0 b0 b14 b14 b9 b7 b10 b2 b13
1 b12 b12 b12 b12 b11 b10 b2 b13
2 b1 b1 b4 b4 b4 b4 b2 b13
3 b5 b15 b6 b6 b19 b19 b2 b13
4 b8 b16 b6 b6 b19 b19 b2 b13
5 b17 b16 b6 b6 b19 b19 b18 b13
6 b3 b3 b3 b3 b3 b3 b3 b3
1000 1400 1500 1600 2400 3000 6200 3100 3800 Gasto::
21
28
33
35
40
44
47
59
Edad:
Gasto = 2000
i = 3
b9
T12
T21
b4
T7
T22
b3
T25
T11
b6
T2
T6
b12

1180 48 1600 T25:
1021 49 2000 T11:
1012 34 1800 T7:
1050 34 1600 T22:
1002 44 1600 T2:
1010 47 2000 T6:
1022 21 2400 T12:
1040 27 1900 T21:
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

45
Bsqueda Parcial por Rangos

Se accede slo a los linear scale de los atributos especificados en la consulta y para las
entradas correspondientes al rango pedido ellos se levantan todas las entradas de los linear scale de
los atributos ausentes.


Ejemplo
Select *
From Clientes
Where gasto > 2000 and gasto < 5000























Luego se realiza la bsqueda de tuplas en los bloques b2, b3, b4, b6, b7, b9, b10, b11,
b12, b13, b18 y b19, hallando como respuesta las tuplas marcadas en la figura:
















0 1 2 3 4 5 6 7
0 b0 b14 b14 b9 b7 b10 b2 b13
1 b12 b12 b12 b12 b11 b10 b2 b13
2 b1 b1 b4 b4 b4 b4 b2 b13
3 b5 b15 b6 b6 b19 b19 b2 b13
4 b8 b16 b6 b6 b19 b19 b2 b13
5 b17 b16 b6 b6 b19 b19 b18 b13
6 b3 b3 b3 b3 b3 b3 b3 b3
1000 1400 1500 1600 2400 3000 6200 3100 3800 Gasto::
21
28
33
35
40
44
47
59
Edad:
2000 Gasto 5000
3 i 7
1008 32 3200 T5:
1028 29 3800 T18:
1180 48 1600 T25:
1021 49 2000 T11:
1002 44 1600 T2:
1010 47 2000 T6:
1022 21 2400 T12:
1040 27 1900 T21:
1012 34 1800 T7:
1050 34 1600 T22:
1004 28 3100 T3:
1026 30 2900 T16:
1025 28 3000 T15:
1024 24 2500 T14:
1029 35 4000 T19:
1170 36 2500 T24:
S
i
l
v
i
a

A
l
i
c
i
a

G

m
e
z

&

L
e
t
i
c
i
a

I
r
e
n
e

G

m
e
z

Base de Datos Clase 13
I TBA - 2006

46
3. Creacin de ndices
Los ndices que cualquier motor genera automticamente son los correspondientes a las
claves primarias (PK).

Algunos motores generan en forma automtica ndices sobre los campos declarados como
Unique, tal es el caso de DB2, y otros lo dejan librado al criterio del administrador de la base.

En particular, DB2 tambin genera en forma automtica ndices sobre las claves forneas
(FK), para mejorar la bsqueda.

La creacin de ndices no es un tarea del programador de un sistema con bases de datos
sino del administrador de la base, cuya funcin es monitorear el rendimiento de la misma. Si el
DBA detecta que hay consultas frecuentes que tardan ms de lo debido, deber analizar la
conveniencia de generar ndices, ya sean simples o compuestos, sobre los campos involucrados.

No es una buena decisin generar ndices antes de comenzar a usar el sistema, es ms,
resulta una psima decisin generar ndices sobre todos los campos, porque es probable que haya
algunos que jams se lleguen a usar y en ese caso se est malgastando espacio de disco y tiempo de
ejecucin en inserciones y borrados.

Por ltimo, hay que prestar atencin al uso de ndices con clave compuesta, porque hay que
recordar que el motor slo los utilizar cuando las consultas involucren la conjuncin de todos los
campos o prefijos de su clave compuesta.


I mportante

Por esta ltima razn, si se tuvieran consultas permanentes del tipo SELECT ...
WHERE campo1=... AND campo2=... pero tambin se contara con consultas frecuentes sobre
slo el campo1 y sobre slo el campo2, bastara con generar el ndice compuesto sobre
(campo1, campo2) y luego un ndice simple sobre el campo1 o bien un ndice simple sobre el
campo2, no ambos, ya que la otra posibilidad la cubre el prefijo del compuesto.

Queda a cargo del lector detectar cul sera el criterio para elegir cul de los dos ndices
simples conviene generar (campo 1 o campo2?).

Você também pode gostar