Está en la página 1de 5

CI-5313: Arquitectura y Administraci´on de Base de Datos I Apuntes del curso INDICES

Soraya Abad Mota

Versi´on 1: Septiembre 2002 Actualizaciones: Enero 2005 y Septiembre 2007

1

T´opico 3: Indices y estructuras para almacenarlos

Una vez estudiadas las organizaciones primarias de archivo y analizados los costos de realizar operaciones ilustrativas sobre las mismas, est´a claro que no se puede lograr mucha flexibilidad en el acceso a los datos del archivo con ellas sino que el acceso est´a restringido a lo que permita la organizaci´on que uno haya elegido. Una manera de agregar flexibilidad en el acceso a los datos y de mejorar los tiempos de acceso es crear una estructura de acceso auxiliar que se utiliza conjuntamente con la organizaci´on primaria del archivo. A esta estructura auxiliar se le llama ´ındice.

Antes de analizar en detalle las estructuras disponibles para construir ´ındices, es nece- sario presentar la terminolog´ıa asociada con ellos y una clasificaci´on de los distintos tipos de ´ındices.

Campo de indizaci´on (indexing field): campo dentro del registro del archivo de datos sobre el cual se define el ´ındice. Usualmente una estructura de ´ındice asocia a cada valor del campo de indizaci´on, una lista de apuntadores a todos los bloques de disco que poseen registros con ese valor en el campo de indizaci´on. Si el campo en base al cual se construye el ´ındice es una clave para el archivo, entonces se le denomina clave de indizaci´on.

Los ´ındices se pueden clasificar de acuerdo a varios criterios.

I Dependiendo de la organizaci´on utilizada para guardar la estructura del ´ındice en s´ı:

Indices ordenados de un solo nivel.utilizada para guardar la estructura del ´ındice en s´ı: Indices de varios niveles ( Multi-level index

Indices de varios niveles (Multi-level index ), sobre todo se utilizan ´arboles de b´usqueda para estructurarlos. Multi-level index), sobre todo se utilizan ´arboles de b´usqueda para estructurarlos.

Indices basados en hashing.se utilizan ´arboles de b´usqueda para estructurarlos. II Dependiendo de la naturaleza del campo en base

II Dependiendo de la naturaleza del campo en base al cual se establece el ´ındice:

Indice primario (primary index ): el campo de indizaci´on es clave para el archivo de datos y primary index): el campo de indizaci´on es clave para el archivo de datos y define la organizaci´on primaria del archivo.

Indice cluster (clustering index ): el campo de indizaci´on no tiene un valor unico´ por registro de clustering index): el campo de indizaci´on no tiene un valor unico´ por registro de datos (no es clave), pero s´ı define la organizaci´on primaria del archivo de datos.

Indice secundario (secondary index ): el campo de indizaci´on utilizado en este caso no define la organizaci´on secondary index): el campo de indizaci´on utilizado en este caso no define la organizaci´on primaria del archivo de datos.

III Dependiendo de si existe un registro de ´ındice por cada registro del archivo de datos o no.

Indice denso (dense index ). Hay una interrelaci´on 1:1 entre los registros del ´ındice y los registros dense index). Hay una interrelaci´on 1:1 entre los registros del ´ındice y los registros de datos.

Indice no denso (sparse or nondense index ). Hay una interrelaci´on 1:n entre los registros del ´ındice y sparse or nondense index). Hay una interrelaci´on 1:n entre los registros del ´ındice y los registros de datos.

IV Dependiendo de si se utiliza un solo campo del registro como campo de indizaci´on o mas de uno, tenemos: Indices con un s´olo campo o Indices con varios campos.

2

0.1. Indices ordenados de un solo nivel

La estructura de ´ındice est´a ordenada por el campo de indizaci´on, de modo que se puede hacer b´usqueda binaria sobre el ´ındice. El archivo de ´ındice es mucho mas peque˜no que el archivo de datos.

0.1.1. Indices Primarios

Un ´ındice primario es un archivo ordenado con registros de longitud fija y dos campos. Un registro de ´ındice i del ´ındice est´a formado por una pareja < K i , P i >, donde K i es del mismo tipo de la clave de ordenamiento del archivo de datos para el cual se est´a creando este ´ındice primario y P i es un apuntador a bloque. El valor de K i corresponde al valor de la clave de ordenamiento del primer registro en el bloque apuntado por P i , a este primer registro se le llama registro ancla. Si K es un valor de la clave que est´a en el bloque apuntado por P i , entonces se cumple la siguiente desigualdad K i <= K <= K i+1 donde K i y K i+1 son entradas consecutivas del archivo de ´ındice. El n´umero de entradas en el ´ındice es igual al n´umero de bloques del archivo de datos.

Como el archivo de datos est´a ordenado, cuando se actualizan los datos, los registros del archivo cambian de posici´on, algunos registros pueden cambiar de bloque con lo cual los registros ancla pueden cambiar. Por lo tanto, al actualizar el archivo de datos muy posiblemente ser´a necesario actualizar el archivo de ´ındice y por tratarse de un archivo ordenado tambi´en esta operaci´on puede ser costosa. En consecuencia este tipo de ´ındice es apropiado para un archivo datos que tenga ninguna o pocas actualizaciones.

0.1.2. Indices Cluster

Si el archivo de datos est´a ordenado por un campo que no es clave, ese campo se puede usar como campo de clustering para construir un ´ındice cluster. Lo que es com´un a los ´ındices primarios y cluster es que la organizaci´on f´ısica del archivo es de acuerdo al ´ındice, los registros de datos est´an dispuestos en el orden dado por el campo de indizaci´on. Esta caracter´ıstica los distingue de los ´ındices secundarios que se cubren en la pr´oxima secci´on.

Un ´ındice cluster es un archivo ordenado con registros de longitud fija de dos campos. Una entrada i del ´ındice cluster est´a formada por una pareja < C i , P i >, donde C i es del mismo tipo del campo de clustering, es decir del campo por el cual est´a ordenado el archivo de datos para el cual se est´a creando este ´ındice cluster, y P i es un apuntador a bloque. El n´umero de entradas en el ´ındice cluster es igual al n´umero de valores distintos del campo de clustering. Por lo tanto este es un ´ındice no denso.

0.1.3. Indices Secundarios

Un ´ındice secundario, a diferencia de los ´ındices primarios y los cluster, se define sobre un campo que no determina la organizaci´on primaria del archivo y provee un camino de acceso secundario al archivo de datos. Es un archivo ordenado cuyos registros tienen dos campos. Una entrada i del ´ındice secundario est´a formada por una pareja < CI i , A i >,

3

donde CI i es el campo de indizaci´on y es del mismo tipo que alg´un campo del archivo de datos, que no es un campo de ordenamiento, y A i es un apuntador a bloque o un apuntador a registro. Puede haber muchos ´ındices secundarios para un mismo archivo de datos, sin embargo, solo puede haber un ´ındice primario o un ´ındice cluster para un archivo de datos.

Hay varias alternativas para los ´ındices secundarios, dependiendo de la naturaleza del campo de indizaci´on. A continuaci´on presentamos estas alternativas.

1. Si se utiliza un campo que es un candidato a clave para el archivo de datos, como campo de indizaci´on, se consigue un ´ındice denso, los apuntadores son a bloque, pero hay una entrada del ´ındice por cada registro del archivo de datos.

2. Si se utiliza un campo que no es clave para el archivo de datos, hay varias opciones, a saber:

a) Colocar varias entradas del ´ındice con el mismo valor CI i , una por cada registro que tenga ese valor en el campo de indizaci´on.

b) Se permite que los registros del ´ındice secundario sean de longitud variable, pues ahora el campo apuntador de este archivo es un campo multivaluado.

c) Se deja que los registros del ´ındice secundario sean de longitud fija, pero con un segundo nivel de direccionamiento, pues ahora el apuntador A i de la entrada i del ´ındice apunta a un bloque que contiene los apuntadores a todos los registros de datos que tienen el valor CI i en el campo de indizaci´on.

0.1.4. Ejemplos de ahorros de tiempo con los ´ındices

Antes de continuar con otras estructuras para organizar los ´ındices ilustramos el ahorro en costos al utilizar ´ındices ordenados.

Tenemos un archivo de datos con los siguientes par´ametros:

r = 30.000 registros (n´umero total de registros en el archivo)

r

= 30.000 registros (n´umero total de registros en el archivo)

T = 1024 bytes (tama˜no del bloque de disco)

T

= 1024 bytes (tama˜no del bloque de disco)

= 100 bytes (longitud del registro de datos, se supone que es fija y que

= 100 bytes (longitud del registro de datos, se supone que es fija y que los registros se almacenan en los bloques con la opci´on “unspanned”).

l

bfr es el factor de bloqueo del archivo de datos.

bfr es el factor de bloqueo del archivo de datos.

B = 3000 bloques para almacenar el archivo de datos.

B

= 3000 bloques para almacenar el archivo de datos.

bfr i es el factor de bloqueo del archivo de ´ındice.

bfr i es el factor de bloqueo del archivo de ´ındice.

V = 9 es la longitud del campo por el cual est´a ordenado el archivo

V

= 9 es la longitud del campo por el cual est´a ordenado el archivo de datos y el

campo de indizaci´on por el cual se construy´o el ´ındice primario.

P = 6 es el tama˜no del apuntador.

P

= 6 es el tama˜no del apuntador.

l i = 15 es la longitud del registro de ´ındice.

l i = 15 es la longitud del registro de ´ındice.

4

En el primer ejemplo, comparamos la b´usqueda por igualdad utilizando una organizaci´on primaria de archivo ordenado para el archivo de datos con un ´ındice primario. En ambos casos se utiliza el mismo campo para la organizaci´on primaria y para el ´ındice y ´este es el mismo campo por el cual se est´a realizando la b´usqueda.

Con el archivo ordenado, como organizaci´on primaria del archivo de datos se puede aplicar b´usqueda binaria, la cual tiene un costo de log 2 b = log 2 3000 = 12.

Con el ´ındice primario por el campo de ordenamiento del archivo de datos, tenemos que: caben bfr i = 1024/15 = 68 registros de ´ındice por bloque. Como es un ´ındice primario, el campo de ordenamiento es clave, por lo tanto r i , el n´umero de registros de ´ındice es igual al n´umero de bloques del archivo de datos. Por lo cual el archivo de ´ındice necesita r i /bfr i = 3000/68 = 45 bloques. La b´usqueda binaria en el ´ındice cuesta:

(log 2 45) = 6 accesos a bloque + 1 para los datos, lo cual da un total de 7 accesos a bloque.

Para ilustrar la ayuda que puede brindar un ´ındice secundario, supongamos que la b´usqueda por igualdad se va a hacer por un campo que no es el campo por el cual est´a or- ganizado el archivo de datos, de modo que no hay un ´ındice primario ni uno cluster definido para ese campo. En este caso, para buscar un valor de ese campo se necesita en promedio, revisar la mitad de los bloques de disco que ocupa el archivo de datos, en otras palabras, necesitamos acceder b/2 = 3000/2 = 1500 bloques en promedio. Si creamos un ´ındice se- cundario por este campo y suponemos que la longitud de ese campo es 9 bytes. El bfr i = 68 y el ´ındice debe ser denso, por lo cual B i = 30000/68 = 442 bloques. Una b´usqueda binaria sobre este ´ındice requiere de: log 2 442 = 9 accesos a bloques del ´ındice + 1 para acceder al registro de datos, lo cual da un total de 10 accesos a bloque y es bastante mejor que los 1500 accesos necesarios al no tener el ´ındice secundario.

5