You are on page 1of 35
CAPITULO 6 Estructuras de indices para ficheros En este capitulo, suponemos que existe ya un fichero con alguna organizacién primaria como las organizaciones no ordenada, ordenada, 0 con direccionamiento calculado, que se describieron en el Capttulo 5. Describiremos estructuras de acceso auxiliares adicionales Hlamadas indices, que se uusan para aumentar la velocidad de recuperaci6n de registros en respuesta a ciertas condiciones de biisqueda. Las estructuras de indice normalmente proporcionan caminos de acceso secundario, que proporcionan caminos alternativos para acceder a los registros sin que afecte la posicisn fisica de los registros en el fichero, Permite un acceso eficiente a registros baséndose en campos de in- dexacién que se utilizan para construir el indice. Bésicamente, cualquier campo del fichero puede usarse para crear un indice; también se pueden construir en el mismo fichero multiples indices so- bre varios campos. Son posibles una gran variedad de indices; cada uno de ellos usa una estructura de datos particular para agilizar la bisqueda. Para encontrar un registro o registros del fichero ba- séndonos en cierto criterio de seleccién de un campo indice, primero hay que acceder al indice, que apunta a uno o més bloques del fichero donde se encuentra el registro buscado. Los tipos de indice més utilizados se basan en ficheros ordenados (indices de un solo nivel) y estructuras de datos en Arbol (indices multinivel, érboles B*). Los indices también se pueden construir basdndose en el direccionamiento calculado o en otras estructuras de datos de bisqueda. Describimos diferentes tipos de indices ordenados de un solo nivel (primario, secundario, y de agrupacién) en la Seccién 6.1. Viendo un indice de un solo nivel como un fichero ordenado, se pueden desarrollar indices adicionales a é1, dando lugar a los fndices multinivel. En esta idea se basa un conocido esquema de indexacién Hamado ISAM (Indexed Sequential Access Method). Es- tudiamos los indices multinivel en la Seccién 6.2. En la Secci6n 6.3 describimos los arbotes B y los arboles B~, que son estructuras de datos que se utilizan cominmente en SGBD para implemen- tar indices multinivel que cambian dindmicamente. Los érboles B* se han convertido en la estruc- tura por defecto comiinmente aceptada en la mayorfa de los SGBD relacionales para generar indi- ces cuando se solicitan. La Seccin 6.4 se ocupa de los caminos alternativos para acceder a los datos basdndose en la combinacién de multiples claves. En la Seccién 6.5, estudiamos cémo se Fundamentos de sistemas de bases de datos pueden usar otras estructuras de datos (como el direccionamiento calculado) para construir indices. También introducimos brevemente el concepto de indices légicos, que dan un nivel adicional de indireccién respecto a los indices fisicos, permitiendo al indice fisico ser flexible y extensible en su organizacién. La Secci6n 6.6 resume el capitulo. Tipos de indices ordenados un solo nive La idea en la que se basa una estructura de acceso de indices ordenada es similar a la que subyace en la usada en un libro de texto, que enumera los términos importantes al final del libro en orden alfabético junto con una lista de los némeros de pagina en los que aparecen los términos en el libro. Podemos buscar en el indice para encontrar una lista de direcciones, nimeros de pagina en este caso, y usar estas direcciones para localizar el término en el texto buscando en las paginas especificadas. La alternativa, si no se encuentra con alguna otra guia, es leer todo el libro palabra por palabra hasta encontrar el término que nos interesa; esto seria equivalente a efectuar una biis- queda lineal en un fichero. Desde luego, la mayorfa de los libros ofrecen informacién adicional, como los titulos de los capitulos y secciones, que pueden ayudarnos a localizar un término sin te- ner que buscar en todo el libro. Sin embargo, el fndice es la tinica sefializacién exacta de dondg aparece cada término en el libro. Para un fichero con una estructura de registro dada consistente en varios campos (0 atributos), Ja estructura de acceso de indice suele definirse sobre un solo campo del fichero, el Hamado cam- po de indexacién (0 atributo de indexacién).' Por lo general, el indice almacena todos los valo- res del campo de indexacién junto con una lista de punteros a todos los bloques del disco que contienen registros con ese valor en ese campo. Los valores en el indice estén ordenados para que podamos efectuar buisquedas binarias en el {ndice. Como el fichero del indice es mucho ms pe- quefio que el de datos, una busqueda binaria en un indice es bastante eficiente. La indexacién mul- tinivel (véase Seccién 6.2) hace innecesarias las buisquedas binarias a expensas de la construccién de indices sobre el propio indice. Hay varios tipos de indices ordenados. Un indice primario esta especificado sobre el campo clave de ordenacién de un fichero de registros ordenados. Recordemos que en la Seccién 5.8 vi- mos que un campo clave de ordenacién sirve para ordenar fisicamente los registros del fichero en el disco, y que cada registro tiene un valor sinico en ese campo. Si el campo de ordenacién no es un campo clave, esto es, si varios registros del fichero pueden tener el mismo valor del campo de ordenaci6n, se puede utilizar otro tipo de indice, el indice de agrupacién. Cabe destacar que un fichero puede tener como maximo un campo de ordenacién fisica, asi que puede tener como méxi- mo un fndice primario o un indice de agrupacién, pero no ambos. Un tercer tipo de indice, el indi- ce secundario, se puede especificar sobre cualquier campo del fichero que no sea el de ordena- cién. Un fichero puede tener varios indices secundarios ademas de su método de acceso primario. En las tres subsecciones siguientes analizaremos estos tres tipos de indices de un solo nivel. 6.1.1. indices primarios Un indice primario es un fichero ordenado cuyos registros son de longitud fija y contienen dos campos. El primero de estos campos tiene el mismo tipo de datos que el campo clave de ordena- cién (llamado clave primaria) del fichero de datos, y el segundo campo es un puntero a un bloque © Utilizaremos los términos campo y atributo indistintamente en este capitulo. Estructuras de indices para ficheros 149 de disco (una direccién de bloque). Hay una entrada de indice (0 registro de indice) en el fichero del indice por cada bloque del fichero de datos. Cada entrada del indice contiene, como valores de sus dos campos, la clave primaria del primer registro de un bloque y un puntero a ese bloque. A estos dos valores de los campos de la entrada de indice i los llamaremos . Para crear un indice primario sobre el fichero ordenado de 1a Figura 5.9, usamos el campo NOMBRE como clave primaria, porque es el campo clave de ordenacién del fichero (suponiendo que todos los valores de NOMBRE sean tnicos). Cada entrada del indice tiene un valor de NOMBRE y un puntero. Las primeras tres entradas del indice son: La Figura 6.1 ilustra este indice primario. El ntimero total de entradas del indice es igual al niimero de bloques de disco del fichero de datos ordenado. El primer registro de cada blogue del fichero de datos se denomina registro ancla del bloque, o simplemente ancla del bloque. Los indices se pueden dividir también en densos o dispersos. Un indice denso tiene una entra- da de indice por cada valor de clave de biisqueda (y por tanto por cada registro) del fichero de datos. Un indice disperso (o no denso), por el contrario, tiene entradas de indice slo para algunos de los valores de biisqueda. Un indice primario es por tanto un fndice no denso (disperso), ya que incluye una entrada por cada bloque de disco del fichero de datos en lugar de por cada valor de busqueda (0 cada registro). El fichero, del {ndice de un fndice primatio requiere muchos menos bloques que el fichero de datos, por dos razones. Primera, hay menos entradas de indice que registros en el fichero de datos. Segunda, cada entrada del indice suele ser de menor tamafio que un registro de datos porque sélo tiene dos campos; en consecuencia, en un bloque pueden caber més entradas de indice que regis- tros de datos. Por eso una biisqueda binaria en el fichero del indice requiere menos accesos a blo- ques que una biisqueda binaria en el fichero de datos. A un registro cuyo valor de clave primaria sea K le corresponde estar en el bloque cuya direc- cién es P(i), donde K(i) < K < K(i + 1). El i-ésimo bloque del fichero de datos contiene todos esos registros debido a la ordenacién fisica de los registros del fichero segtin el campo de clave primaria, Para recuperar un registro, dado el valor K de su campo de clave primaria, realizaremos una biisqueda binaria en‘el fichero del indice hasta encontrar la entrada de indice apropiada, i, y luego recuperaremos el bloque del fichero de datos cuya direccién sea P(i).> El Ejemplo 1 ilustra el ahorro en accesos a bloques que se puede lograr cuando se utiliza un indice primario para buscar un registro. . EJEMPLO 1: Suponga que tenemos un fichero ordenado con r = 30.000 registros almacenados en un disco con un tamafio de bloque B = 1.024 bytes. Los registros del fichero son de longitud fija y no estén extendidos, tienen una longitud R = 100 bytes. El factor de bloques del fichero serfa fb1 = [(B/R)| = |(1.024/100)] = 10 registros por bloque. El néimero de bloques requerido para el fichero es b = [(r/fbl)] = [(30.000/10)| = 3.000 bloques. Una busqueda binaria en el fichero de datos requeriria aproximadamente [(log, b)] = [(log, 3.000)] = 12 accesos a bloques. 2 Podemos usar un esquema similar al descrito aqui, pero con’el uitimo registro de cada blogue (en vez del primero) como ancla del bloque. Esto mejora un poco la eficiencia del algoritmo de biisqueda. 3 Debemos tener en cuenta que la formula anterior no serfa correcta si el fichero de datos estuviera ordenado por un campo no clave; en ese caso el valor de indexacién del ancla del bloque podria repetirse en los tiltimos registros del bloque anterior. 150 Fundamentos de sistemas de bases de datos FICHEROS DE DATOS (CAMPO DE CLAVE, PRIMARIA) NOMBRE _NSS_FECHANAC_PUESTO SALARIO SEXO ‘aon, Ea ‘Abbott, Diane ‘Acosta Mare ‘Aas, John ‘Adams, Rob FICHERO INDICE (entradas ) eer Jan 2 VALOR DE CLAVE: ‘Alexander Ed PRIMARIA “ved, Bob DELANCLA —_PUNTERO. DELBLOQUE —ABLOQUE ‘aren, ‘Adar Joe ced ‘An, ‘Anderson, Zach ‘Arnel, Mack Wong dames ‘Wood, Donald Woods, Manny Wah Pam Wivat, Chaos Zier BOR Figura 6.1. indice primario sobre el campo clave de ordenacién del fichero mostrado en la Figura 5.9. Supongamos ahora que el campo clave de ordenacién del fichero tiene V= 9 bytes de longi tud, que un puntero a bloque tiene P = 6 bytes de longitud y que hemos construido un indice pri- mario para el fichero. El tamafio de cada entrada del indice es R, = (9 + 6) = 15 bytes, de modo que el factor de bloques del indice es fol; = |(B/R;)| = |(1.024/15)| = 68 entradas por bloque. El mimero total de entradas del indice r; es igual al niimero de bloques del fichero de datos, que es 3.000. Por tanto, el ntimero de bloques del indice es b; = [(r,/fbl.)] = [(3.000/68)] = 45 bloques. Estructuras de indices para ficheros 151 Efectuar una biisqueda binaria en el fichero de indice requerirfa [(log, b,)] = [(og,45)] = 6 acce- sos a bloque. Para buscar un registro usando el indice, necesitamos un acceso adicional a un blo- que del fichero de datos que hace un total de 6 + 1 = 7 accesos a bloques. Esto es una mejora sobre la biisqueda binaria en el fichero de datos que requeriria 12 accesos a bloques. Un problema importante con los indices primarios, asf como con cualquier fichero ordenado, es la insercién y eliminacién de registros. El problema se complica en el caso de un indice primario, porque si intentamos insertar un registro en su posicién correcta dentro del fichero de datos, no } _ s6lo debemos desplazar registros-a fin de abrir espacio para el nuevo registro, sino que tendremos ) que modificar algunas entradas del indice, pues el desplazamiento de registros alterard los registros ancla de algunos bloques. Podemos emplear un fichero no ordenado de desbordamiento, como ex- plicamos en la Seccién 5.8, para reducir este problema. Otra posibilidad es usar una lista enlazada de registros de desbordamiento por cada bloque del fichero de datos. Esto es similar al método del manejo de registros de desbordamiento que describimos junto con el direccionamiento calculado en la Seccién 5.9.2. Los registros dentro de cada bloque y su lista enlazada de desbordamiento se pueden ordenar para mejorar el tiempo de recuperacién. La eliminacién de registros se maneja me- diante marcadores de eliminacién. 6.1.2. indices de agrupacién Si los registros de un fichero estén ordenados fisicamente segtin un campo no clave, que no tiene un_valor distinto para cada registro, dicho campo se denomina campo de agrupacién. Podemos crear un tipo diferente de indice, llamado indice de agrupaci6n, para acelerar la recuperacién de registros qué tienen el mismo valor en el campo de agrupacién. Esto no es lo mismo que un indice primario, que requiere que el campo de ordenacién del fichero de datos tenga un valor distinto para cada registro. Un indice de agrupacién es también un fichero ordenado con dos campos; el primero es del mismo tipo que el campo de agrupacién del fichero de datos, y el segundo es un puntero a un bloque. Hay una entrada en el indice de agrupacién por cada valor distinto del campo de agrupa- cién y contiene el valor y un puntero al primer bloque del fichero de datos que tenga un registro con ese valor en el campo de agrupacién. La Figura 6.2 muestra un ejemplo. Observe que la inser- ci6n y la eliminacién de registros siguen causando problemas, porque los registros de datos estén ordenados fisicamente. A fin de aliviar el problema de inserci6n, se suele reservar un bloque com- pleto (o un grupo de bloques contiguos) por cada valor del campo de agrupacién; todos los regis- tros con ese valor se colocan en el bloque (0 grupo de bloques). Esto hace relativamente sencillas la inserci6n y la eliminacién. La Figura 6.3 muestra este esquema. Los indices de agrupacin son un ejemplo mas de indices no densos, porque tienen una entrada por cada valor distinto del campo de indexacién, no por cada registro del fichero. Hay una cierta similitud entre las Figuras 6.1 y 6.3, por un lado, y la Figura 5.13, por el otro. Los indices son un tanto parecidos a las estructuras de directorio empleadas para el direccionamiento extensible, des- crito en la Seccién 5.9.3. En ambos se busca un puntero al bloque de datos que contiene el registro deseado. Una diferencia importante es que la btisqueda en un indice utiliza los valores del propio campo de biisqueda, en tanto que la bisqueda-en un directorio de direccionamiento calculado emplea los valores de direccionamiento que se calculan aplicando la funcién de direccionamiento calculado al campo de busqueda. 152 Fundamentos de sistemas de bases de datos FICHEROS DE DATOS (CAMPO DE ‘AGRUPACION) NUMDEPT NOMBRE NSS _PUESTO FECHANAC SALARIO 1 1 1 2 FICHERO INDICE (entradas ) a 3 3 vaLon 3 DELCANPO. PUNTERO DEAGRUPACION _ABLOQUE 3 1 v7 5 2 e 7 3 oe a 4 cm 5 —}——_ 5 6 = 5 7 ~ 5 5 6 6 6 6 6 8 8 8 Figura 6.2. indice de agrupacién sobre el campo de ordenacién no clave NumoEPT de un fichero eweLeanos. indices secundarios Un indice secundario es también un fichero ordenado con dos campos. El primer campo es del mismo tipo de datos que el de cualquier campo que no sea el de ordenacién del fichero de datos, y se denomina campo de indexaci6n. El segundo campo es o bien un puntero a bloque o bien un puntero a registro. Puede haber varios indices secundarios (y por tanto, campos de indexacién) para el mismo fichero. Primero consideraremos una estructura de acceso de indice secundario sobre un campo clave que tiene un valor distinto para cada registro. En ocasiones a estos campos se les llama claves secundarias. En este caso hay und entrada de indice por cada registro del fichero de datos, que contiene el valor de la clave secundaria para ese registro y un puntero, ya sea al bloque en el que esté almacenado ese registro o al registro mismo. Por tanto, el indice es denso. Estructura de indices para ficheros 153 FICHEROS DE DATOS (CAMPO DE AGRUPACION) NUMDEPT NOMBRE NSS PUESTO FECHANAC SALARIO 1 1 7 puters a BogTS puntoro nulo puntero nulo mero a Bogue mieto ak FICHERO INDICE (ertradas ) VALOR. DELCAMPO, PUNTERO DEAGRUPACION ABLOQUE 1 unter bloave puntero nulo = pana a nar a Bogue. ero a Bogue puntero nuio puntere a Bogue puntero nulo uniare a beaue puntero nulo Figura 6.3. Indice de agrupacién con un grupo de bloques separado para cada grupo de registros que comparten el mismo valor del campo de agrupaci6n. 154 Fundamentos de sistemas de bases de datos FICHERO DE DATOS CAMPO DE INDEXACION (CAMPO, DE CLAVE ‘SECUNDARIA) 9 5 13 8 FICHERO INDICE {entradas ) VALOR, DELCAMPO, PUNTERO DE INDEXACION ABLOQUE 6 16 3 7 24 iT 16 2 @ 10 1 2 13 4 © 16 7 18 19 20 24 22 23 oh Figura 6.4, indice secundario denso (con punteros a bloques) sobre un campo clave que no es el de ordenacién de un fichero. Una vez més nos referimos a los dos valores de la entrada de indice como . Las entradas estan ordenadas segtin el valor de K(i), asi que podemos realizar una busqueda binaria, Como los registros del fichero de datos no estin ordenados fisicamente segtin los valores del campo de clave secundaria, no podemos usar anclas de bloques. Por eso se crea una entrada de indice por cada registro del fichero de datos y no por cada bloque, como en el caso de un indice primario. La Figura 6.4 ilustra un indice secundario en el que los punteros P() de las entradas del indice son pun- teros a bloques, no punteros a registros. Una vez transferido el bloque apropiado a la memoria princi- pal, se puede efectuar una btisqueda del registro deseado dentro del bloque. Normalmente un indice secundario necesita més espacio de almacenamiento y tiempos de biis- queda més largos que un indice primario, debido a su mayor ntimero de entradas, No obstante, la ‘mejoria en el tiempo de biisqueda de un registro arbitrario es mucho mayor para un indice secun- Estructuras de indices para ficheros 155, dario que para uno primario, pues tendrfamos que realizar una busqueda lineal en el fichero de datos si no existiera el indice secundario, En el caso de un indice primario, podriamos realizar una busqueda binaria en el fichero principal, incluso si no existiera dicho indice. El Ejemplo 2 ilustra la mejorfa en el ntimero de accesos a bloques. EJEMPLO 2: Consideremos el fichero del Ejemplo 1 con r = 30.000 registros de longitud fija de tamafio R = 100 bytes, almacenado en un disco con un tamafio de bloque B = 1.024 bytes. El fi- chero tiene b = 3.000 bloques, segiin se calculé en el Ejemplo 1. Para efectuar una biisqueda lineal en este fichero tendriamos que realizar b/2 = 3,000/2 = 1.500 accesos a bloques en promedio. Su- Pongamos que construimos un fndice secundario basado en un campo clave que no sea el de orde- naci6n del fichero que tiene V = 9 bytes de longitud. Al igual que en el Ejemplo 1, un puntero a bloque tiene P = 6 bytes de longitud, asf que cada entrada de indice tiene R, = (9 + 6) = 15 bytes y él factor de bloques del indice tiene fbl, = |(B/R,)| = [(1.024/15)| = 68 entradas por bloque. En un indice secundario denso como éste, el ntimero total de entradas del indice r, es igual al mimero de registros del fichero de datos, que es 30.000. El nimero de bloques requeridos para el indice ser entonces b; = [(r,/f1,)] = [(30.000/68)] = 442 bloques Una biisqueda binaria en este indice secundario requiere [(log, b,)] = [(log, 442)] = 9 accesos a bloque. Para buscar el registro empleando el indice, requeriremos un acceso adicional a un blo- que del fichero de datos haciendo un total de 9 + 1 = 10 accesos a bloque, mucho menor que los 1.500 accesos a bloque que requiere en promedio una biisqueda lineal, pero no tan bueno como los 7 accesos a bloque que se necesitan con el indice primario. También podemos crear un indice secundario sobre un campo no clave de un fichero. En este caso, varios registros del fichero de datos pueden tener el mismo valor en el campo de indexacién. Disponemos de varias opciones para implementar un indice ast: « La Opcién 1 consiste en incluir varias entradas del indice con el mismo valor K(j), una por registro. El indice seria denso. « La Opcién 2 consiste en usar registros de longitud variable para las entradas del {ndice, con un campo repetitivo para el puntero. Mantendremos una lista de punteros en la entrada del indice de K(i), con un puntero a cada bloque que contenga un registro cuyo valor del campo de indexacién sea igual a K(i). Tanto en la opcién 1 como en la 2, sera necesario modificar apropiadamente el algoritmo de busqueda binaria sobre el indice. La Opcién 3, que se utiliza més a menudo, consiste en usar entradas de indice de longitud fija y tener una sola entrada por cada valor del campo de indexacién, pero creando un nivel de indireccién adicional para manejar los punteros multiples. En este esquema no denso, el puntero P(i) de una entrada de indice apunta a un bloque de punteros a regis- tros; cada puntero a registro de ese bloque apunta a uno de los registros del fichero de datos que tiene el valor K(i) en el campo de indexaci6n. Si algiin valor K(i) se repite en demasia- dos registros, de modo que sus punteros a registros no quepan en un solo bloque de disco, se utiliza un grupo o una lista enlazada de bloques. Esta técnica se ilustra en la Figura 6.5. La recuperacion a través del indice requiere uno 0 més accesos adicionales a bloque debido al nivel extra, pero los algoritmos para buscar en el indice y, lo que es més importante, para insertar nuevos registros en el fichero de datos son sencillos. Ademés, las recuperaciones con condiciones de seleccién complejas pueden manejarse haciendo referencia a los punteros, sin tener que recuperar muchos registros innecesarios del fichero (véase el Ejercicio 6.19). Hay que destacar que un indice secundario proporciona una ordenacién légica de los registros segtin el campo de indexacién. Si tenemos acceso a los registros en el orden que tienen las entradas del indice secundario, los obtendremos en_orden segiin el campo de indexacién. 156 —_ Fundamentos de sistemas de bases de datos FICHERO DE DATOS (CAMPO DE INDEXACION) BLOQUES: NUMDEPT NOMBRE NSS PUESTO FECHANAC SALARIO DE PUNTEROS AREGISTROS FICHERO INDICE (entradas <0), PO>) VALOR DEL PUNTERO “"Figuta.8.6. Indice secundario (con punteros a registro) sobre un campo no clave implementado 7 usando un nivel de indireccién para que las entradas del indice sean de longitud fija y tengan valores Unicos en los campos. Para coricluir esta secci6n, resumimos en dos tablas nuestro anflisis de los tipos de indices. La \ Tabla 6.1: muestra tas caracteristicas que tiene el campo de indexacién de todos los tipos de indices ordenydds de un solo nivel que hemos visto: primarios, de agrupacién y secundatios. La Tabla 6.2 reauftif'las: propiedades de cada tipo de indices comparando el ntimero de entradas del indice y especificando qué indices son densos y cuales emplean anclas de bloque del fichero de datos. Tabla 6.1. Tipos de indices. Campo clave Campo no clave Campo de ordenacion Indice primario Indice secundario (clave) Campo que no es el de ordenacién indice de agrupaci6n Indice secundario (no clave) Estructuras de indices para ficheros. = 157. Tabla 6.2. Propiedades de los tipos de indices. Numero radas del indice Denso o Ancla de bloque (Primer-nivel) no denso del fichero de datos Primario Numero de bloques del fichero No denso Si de datos Th Agrupacién —_ Numero de valores distintos No denso Sifno* pos del : de jel campo indice Indices Secundario Numero de registros del fichero Denso No (clave) de datos Secundario —_ Numero de registros® o numero Denso o No {no clave) de valores distintos del campo indice® no denso Si si cade valor distinto del campo de ordenacién inicia un nuevo bloque; no en cualquier otro caso. ‘pein ‘opciones 2 y 3. Petter RL Los esquemas de indexacién hasta aqui descritos implican un fichero de indice ordenado. Aplica- mos una btisqueda binaria al indice para localizar punteros a un bloque del disco o al registro (0 registros) del fichero que tienen un cierto valor en el campo de indexacién. Una bisqueda binaria requiere aproximadamente (log, b,) accesos a bloque para un indice con b, bloques, porque cada paso del algoritmo reduce a la mitad la parte del fichero del indice que seguiremos examinando. Por eso aplicamos la funcién logaritmica de base 2. Los indices multinivel se basan en la idea de reducir la parte del indice que seguiremos examinando en fbl, (factor de bloques del indice) que es mayor que 2. Por tanto, el espacio de busqueda se reduce con mucha rapidez. El valor fbl; se cono- ce como abanico (fan-out) del indice multinivel y nos referiremos a él con la abreviatura fo. Una biisqueda en un indice multinivel requiere aproximadamente (log,,b,) accesos a bloque, que es una cifra menor que la de Ja biisqueda binaria si el abanico es mayor que 2. El indice multinivel considera el fichero del indice, al que ahora lamaremos primer nivel (0 nivel base) del indice multinivel, como un fichero ordenado con un valor distinto para cada K(i). Por tanto, podemos crear un {ndice primario para este primer nivel; a este indice del primer nivel se le denomina segundo nivel del indice multinivel. Como el segundo nivel es un indice primario, podemos usar anclas de bloques para que el segundo nivel tenga una entrada por cada bloque del primer nivel. El factor de bloques fb; del segundo nivel, y de todos los niveles siguientes, es el mismo que el del indice de primer nivel, porque todas las entradas del indice tienen el mismo ta- majio; cada una tiene un valor de campo y una direccién de bloque. Si el primer nivel tiene r, entradas, y el factor de bloques (que es también el abanico) del indice es fbl; = fo, entonces el primer nivel requerir4 [(r,/fo)] bloques, que en consecuencia ser4 el ntimero de entradas r, reque- ridas en el segundo nivel del indic Podemos repetir este proceso para el segundo nivel. El tercer nivel, que es un indice primario del segundo nivel, tiene una entrada por cada bloque del segundo nivel, asf que el ntimero de entra- das del tercer nivel es r; = [(r2/fo)|. Cabe sefialar que s6lo necesitaremos un segundo nivel si el primero requiere més de un bloque de almacenamiento en disco, y, de manera similar, s6lo necesi- taremos un tercer nivel si el segundo requiere més de un bloque. Podemos repetir el proceso ante- rior hasta que todas las entradas de un nivel t del indice quepan en un solo bloque. Este bloque 158 Fundamentos de sistemas de bases de datos. INDICE DE DOS NIVELES FICHERO DE DATOS CAMPO CLAVE PRIMARIA. PRIMER NIVEL, (BASE) 2 8 15 24 ‘SEGUNDO NIVEL (SUPERIOR) 2/8) [le] |B] x) | £ BIB) |B) a) |z/ a ele] jes} fal~ Figura 6.6. indice primario de dos niveles semejante a la organizacién ISAM (Indexed Sequential Access Method o Método de Acceso Secuencial Indexado). del 1-€simo nivel se denomina {ndice de nivel superior.* Cada nivel reduce el niimero de entradas del nivel anterior en un factor de fo (el abanico del indice), asf que podemos usar la formula 1 <(r,/(fo)’)) para calcular ¢, Por tanto, un indice multinivel con r, entradas en el primer nivel tendra aproximadamente f niveles, donde t = [(log,,(r1))]- El esquema multinivel que hemos descrito se puede usar para cualquier tipo de indice, sea pri- mario, de agrupacién o secundario, siempre que el indice del primer nivel tenga valores distintos para K(i) y entradas de longitud fija. La Figura 6.6 muestra un indice multinivel construido sobre un indice primario. El Ejemplo 3 ilustra la mejoria en el ntimero de bloques accedidos cuando se utiliza un indice multinivel para buscar un registro. * El esquema de numeracién de los niveles del indice que usamos aqut es el inverso de la forma que se suele utilizar para definir los niveles de las estructuras de datos en drbol. En éstas, # se considera el nivel 0 (cero), ¢ ~ 1 es el nivel 1, etc. Estructuras de indices para ficheros_ = 159 EJEMPLO 3: Suponga que el indice secundario denso del Ejemplo 2 se convierte en un indice multinivel. Calculamos un factor de bloques fbl; = 68 entradas de indice por bloque, que también es el abanico fo para el indice multinivel; también se calcul el mimero de bloques del primer nivel b, = 442 bloques. El ntimero de bloques del segundo nivel serd b, = [(b,/fo)] = [(442/ 68)] = 7 bloques, y el ntimero de bloques del tercer nivel seré b, = [(b,/f0)] = [(7/68)] = 1 blo- que. Por tanto, el tercer nivel es el nivel superior del indice, y ¢ = 3. Para tener acceso a un registro buscando en el indice multinivel, deberemos tener acceso a un bloque de cada nivel y a uno més del fichero de datos, por tanto necesitamos ¢ + 1 = 3+ 1 = 4 accesos a bloque. Comparese esto con el Ejemplo 2, donde se requirieron 10 accesos a bloque empleando un {indice de un solo nivel y una busqueda binaria. Cabe sefialar que también podrfamos tener un indice primario multinivel que fuese no denso. El Ejercicio 6.14(c) ilustra este caso, donde es preciso tener acceso al bloque de datos del fichero antes de que podamos determinar si el registro que se busca est o no en el fichero. En el caso de un indice denso esto puede determinarse teniendo acceso al primer nivel del indice (sin tener que acceder a un bloque de datos), ya que hay una entrada de indice por cada registro del fichero. Una organizacién de ficheros usada normalmente en procesamiento de datos de negocios es un fichero ordenado con un indice primario multinivel sobre su campo clave de ordenacién. Una orga- nizacién de este tipo se denomina fichero secuencial indexado y se utilizé en un gran nimero de los primeros sistemas de IBM. La insercién se maneja por medio de alguna forma de fichero de desbordamiento que se fusiona periédicamente con el fichero de datos. El indice se vuelve a crear durante la reorganizaci6n del fichero. La organizacién ISAM de IBM incorpora un indice de dos niveles que estd estrechamente relacionado con 1a organizacién del disco. El primer nivel es el indice de cilindros, que contiene el valor de clave de un registro ancla por cada cilindro del paque- te de discos y un puntero al indice de pistas del cilindro. El indice de pistas tiene el valor de clave de un registro ancla de cada pista del cilindro y un puntero a la pista. Dicha pista se puede enton- ces recorrer secuencialmente hasta encontrar el bloque o registro deseado. El Algoritmo 6.1 describe el procedimiento de biisqueda de un registro en un fichero de datos que utiliza un indice primario multinivel no denso de ¢ niveles. Nos referiremos a la entrada i del nivel j del indice como , y buscaremos un registro cuyo valor de clave primaria sea K, Supondremos que se ignoran los registros de desbordamiento. Si el registro esté en el fichero, deberd haber una entrada en el nivel 1 con K,(i) < K < K,(i + 1), y el registro estar en el bloque del fichero de datos cuya direccién sea P,(i). En el Ejercicio 6.19 se analiza la modificacién del algoritmo de busqueda para otros tipos de indices. ALGORITMO 6.1. Busqueda en un indice primario multinivel no denso de t niveles. p « direccién del bloque de nivel superior del indice; para j — t disminuyendo 1 a1 hacer principio : leer el bloque de indice (en el j-ésimo nivel) cuya direccién es p; buscar en el bloque p la entrada i tal que K,(i) , donde q < p; cada P, es un puntero a un nodo hijo (0 un puntero nulo); y cada K; es un valor de busqueda proveniente de algtin conjunto ordenado de valores. Se supone que todos los valores de busqueda son tinicos.° La Figura 6.8 ilustra un nodo de un érbol de biisqueda. En un drbol de bisqueda deben cumplirse, en todo momento, las dos resiticciones siguientes: 1. Dentro de cada nodo, Ky < Ky <...< K,-y. 2, Para todos los valores X del subérbol al cual apunta P, tenemos K,_,, Pay y on Py> 7 La definici6n de equilibrado es diferente para los frboles binarios. Los érboles binarios equilibrados se conocen como Arboles AVL. Estructuras de indices para ficheros 163 donde q < p. Cada P, es un puntero de Arbol: un puntero a otro nodo del érbol B. Cada Pr, es un puntero a datos:* un puntero al registro cuyo valor del campo clave de busqueda es igual a K; (0 al bloque del fichero de datos que contiene ese registro). 2. Dentro de cada nodo, K, < Ky <.... Esto funciona correctamente si el fichero tiene un numero relativamente bajo de registros y éstos son pequeftos. En caso contrario, el abanico y el ntimero de niveles se incre- mentan tanto que impiden un acceso eficiente. En resumen, los arboles B proporcionan una estructura de acceso multinivel que es una estruc- tura de 4rbol equilibrado donde cada nodo esté por lo menos leno hasta la mitad. Cada nodo en un 4rbol B de orden p puede tener como méximo p — 1 valores de biisqueda. Arboles B* La mayoria de las implementaciones de indices multinivel dindmicos emplean una variacién de la estructura de datos de arbol B llamada 4rbol B*. En un drbol B, todos los valores del campo de biisqueda aparecen una vez en algiin nivel del drbol, junto con un puntero a datos. En un drbol B*, los punteros a datos se almacenan sdlo en los nodos hoja del Arbol; por lo cual la estructura de los nodos hoja difiere de la de los nodos internos. Los nodos hoja tienen una entrada por cada valor del campo de biisqueda, junto con un puntero a datos al registro (0 al bloque que contiene el regis- tro), si el campo de busqueda es un campo clave. Para un campo de biisqueda que no sea clave, el puntero apunta a un bloque que contiene punteros a los registros del fichero de datos, credndose asf un nivel adicional de indireccién. Los nodos hoja del 4rbol B* suelen estar enlazados para ofrecer un acceso ordenado a los re- gistros segdn el campo de busqueda. Estos nodos hoja son similares al primer nivel (base) de un fndice multinivel. Los nodos internos del 4rbol B* corresponden a los demés niveles del indice multinivel. Algunos valores del campo de biisqueda de los nodos hoja se repiten en los nodos internos del 4rbol B* con el fin de guiar la bisqueda. La estructura de los nodos internos de un arbol B* de orden p (Figura 6.11a) se define de la siguiente manera: 1. Todo nodo interno tiene 1a forma

donde q

al siguonto ° & : aire fod hole do) abo y Y Y v Puntoro _Puntoro Puntero Puntero dedates dedaios de datos de datos Figura 6.11. Nodos de un arbol B*. (a) Nodo interno de un arbol B* con q ~ 1 valores de busqueda. (b) Nodo hoja de un érbol B* con q~ 1 valores de busqueda y q ~ 1 punters a datos. La estructura de los nodos hoja de un drbol B* de orden p (Figura 6.11b) es la siguiente: 1. Todo nodo hoja tiene la forma <, . on Pry-i>sP, donde q n.K, , entoncés n —1.P, sino principio buscar en el nodo n una entrada i tal que n.K, nen.P, fin; leer bloque n fin; buscar en el bloque n la entrada (K,, Pr.) conK=K,; (* buscar nodo hoja *) sise encuentra entonces leer el bloque del fichero de datos con direccién Pr;, y recuperar el registro sino el registro con valor de campo de busqueda K no est4 en el fichero de datos; 1.K,_ entonces n + n.P, sino principio buscar en el nodo n una entrada i tal que n.k, nenP, fin; Leer bloque n fin; a1 ; terminamos + verdadero; fin sino principio n « desempilar de la pila S; si'el nodo interno n no esta 1leno entonces principio (* el nodo padre no est4 lleno: no habrd divisién *) insertar (K, nuevo) en la posicién correcta dentro del nodo interno n; terminamos + verdadero fin sino principio (* el nodo interno n esta 1leno con p punteros de arbol: se dividira *) copiar nen temp (* temp es un nodo interno grande *); insertar (K, nuevo) en temp en la posicién correcta; (* temp tiene ahora p + 1 punteros de arbol *) nuevo « un nuevo nodo interno vacio para el arbol; J = (Cp + 1)/2))5 1 entradas hasta el puntero de rbol P, de temp; (* n contiene *) nuevo « entradas a partir del puntero de Arbol P,",, de temp; (*n contiene *) ‘eaguiente * NUEVO} yi Kaas ee ‘pa? p44 KeK, (* ahora debemos pasar (K, nuevo) al nodo interno padre *) fin fin hasta terminamos fin; Fin; 170 Fundamentos de sistemas de bases de datos ‘SECUENCIA DE INSERCION: 8, 5, 1, 7, 3, 12, 9,6 Insertar 1: desbordamiento (nuevo nivel) PAGING) FJ Puna a nod de a [] Puntero a datos 1 Insertar 7 []revvodettinie regan oh Insertar 3: desbordamiento (divisi6n) i STE, inonar 12 cesborcarions (vstn '8e propaga, nuevo nivel) / ee ( 8 |g \ yo : Tas p(s _f}~(boe top [fel Insertar 6: oh desbordamiento (division, 86 on \ H 718 tals Tt}>{[s. le m{f6 [oL7 [dll |[8 fol jol-m{[ 9 [ol 12 Ia Figura 6.12. Ejemplo de insercidn en un arbol B* con P=3Y Phoja Estructuras de indices para ficheros 171 La Figura 6.12 ilustra la inserci6n de registros en un drbol B* de orden p = 3 Pyoja = 2. Pri- mero, observamos que la raiz es el tinico nodo en el Arbol, asf que también es un nodo hoja, Tan pronto como se crea mas de un nivel, el arbol se divide en nodos internos y nodos hoja. Observe que todo valor de clave debe existir en el nivel de hoja, porque todos los punteros a datos estén en ese nivel, Sin embargo, slo existen algunos valores en los nodos internos para guiar la busqueda. Advierta también que todos los valores que aparecen en un nodo interno aparecen también como el valor del extremo derecho en el nivel de hoja del subarbol al que apunta el. puntero de 4rbol que est a la izquierda del valor. Cuando se lena un nodo hoja y se inserta en él una nueva entrada, el nodo se desborda y hay que dividirlo. Las primeras j = [((Pyoja + 1)/2)] entradas del nodo original se mantienen ahi, y las demés se pasan a un nuevo nodo hoja. El j-ésimo valor de biisqueda se repite en el nodo interno padre, y se crea en él un puntero adicional al nuevo nodo. Estos deben insertarse en el nodo padre en su secuencia correcta. Si el nodo interno padre esté leno, el nuevo valor hard que se desborde también y tendrd que dividirse. Las entradas en el nodo interno hasta P, (el j-ésimo puntero de Arbol después de insertar el nuevo valor y el nuevo puntero, donde j = |((p + 1)/2)}) se conservan, en tanto que el j-ésimo valor de busqueda se pasa al padre, sin duplicacién. Un nuevo nodo interno contendrd las entradas desde P,, , hasta el final de las entradas del nodo (véase el Algoritmo 6.3). Esta divisién puede propagarse hasta arriba para crear un nuevo nodo rafz, y por tanto, un nuevo nivel del Arbol B+. La Figura 6.13 ilustra la eliminacién en un 4rbol B*. Cuando se elimina una entrada, siempre se hace del nivel de hoja. Si aparece en un nodo interno, también habré que quitarla de ahi. En este caso, el valor que estd a su izquierda en el nodo hoja debe reemplazarlo en el nodo interno, porque ahora es la entrada del extremo derecho del subérbol. La eliminacin puede causar insuficiencia si reduce el ntimero de entradas del nodo hoja por debajo del minimo requerido. En este caso tratare- mos de encontrar un nodo hoja hermano (uno que esté inmediatamente a la derecha o a la izquier- da del nodo con insuficiencia) y redestribuiremos las entradas entre el nodo y su hermano de modo que ambos estén ocupados por lo menos hasta la mitad; si esto no es posible, el nodo se fusionard con sus hermanos, reduciéndose asi el nimero de nodos hoja. Un método comin consiste en tratar de redistribuir las entradas con el hermano izquierdo; si esto no es posible, se intenta re- distribuirlas con el hermano derecho. Si tampoco esto es factible, los tres nodos se fusionan para formar dos nodos hoja. En este caso, es posible que la insuficiencia se propague a los nodos inter- nos, al requerirse un puntero de 4rbol y un valor de busqueda menos. Esto puede propagarse y reducir el niimero de niveles del Arbol. Observe que la implementaci6n de los algoritmos para insertar y eliminar puede requerir punte- ros al padre y a los hermanos en todos los nodos, o el empleo de una pila como en el Algoritmo 6.3. Cada nodo deberd incluir también el ntimero de entradas que contiene y su tipo (hoja o inter- no). Otra alternativa es implementar la inserci6n y la eliminacién como procedimientos recursivos. Variaciones de los érboles B y B*. Para concluir esta seccién, hagamos una breve mencién de algunas variaciones de los arboles B y B +. En algunos casos la restriccién 5 de los Arboles B (0 B+), que obliga a todos los nodos a estar ocupados por lo menos hasta la mitad, se puede modifi- car de modo que exija que todos los nodos estén ocupados por lo menos hasta las dos terceras partes de su capacidad. A este tipo de drboles B se les ha llamado érboles B". En general, algunos sistemas permiten que el usuario elija un factor de Henado de entre 0,5 y 1; este ultimo valor indica que los nodos del arbol B (o del indice) deben estar completamente llenos. También es posi- ble especificar dos factores de llenado para los drboles B+: uno para el nivel de hoja y otro para Ios nodos internos del drbol. Al construirse inicialmente el indice, todos los nodos se ocupan hasta alcanzar aproximadamente los factores de llenado especificados. En fechas recientes algunos in- vestigadores han sugerido que el requerimiento de que un nodo esté Lleno hasta la mitad sea menos 172 Fundamentos de sistemas de bases de datos SECUENCIA DE ELIMINACION: 12,9 fol + jole fl eae 1 )o} 6 [0] fe 7 fo 8 [o}'2 [ol]e} [2 Eliminar 5 7 kl fel 4 le ho | 1 |o} 6 jo} jo 7 |) je} 8 [oo ws Eliminar 12: insufctencla (redistribuir) jp] 7 |e of + ele Ph Welt 1 |o lo} je 7 |0| 8 |o| je—|| 9 jo} Eliminar 9: insu pl We il "Tzquierda, pa redugcién de niveles) y 1 |o} je 6 |o| 7 |o}| 8 Io) Figura 6.13. Ejemplo de eliminacién en un arbol B* Cet Estructuras de indices para ficheros 173 riguroso, y se permita que Hegue a estar completamente vacfo antes de efectuarse una fusi6n, a fin de simplificar el algoritmo de eliminacién. Hay estudios de simulacién que indican que esto no desperdicia demasiado espacio adicional si las inserciones y eliminaciones se distribuyen de forma aleatoria. ndices sobre claves multiples Hasta ahora hemos asumido que Jas claves primarias 0 secundarias sobre las que se accede a los ficheros eran atributos simples (campos). En algunas peticiones de recuperacién y modificacién estén involucrados miltiples atributos. Si se usa una cierta combinaci6n de atributos muy frecuen- temente, es mejor crear una estructura de acceso que proporcione un acceso eficiente mediante un valor de clave que sea una combinaci6n de esos atributo: Por ejemplo, considere un fichero EMPLEADOS que contiene los atributos DNO (nimero de depar- tamento), EDAD, CALLE, CIUDAD, CODIGO_ZIP, SALARIO y CODIGO_CONOCIMIENTO y como clave NSS (Ntimero de Seguridad Social). Considere la consulta: «Hacer una lista de los empleados del depar- tamento ntimero 4 cuya edad sea 59». Nétese que tanto DNO como EDAD no son atributos clave, lo que significa que un valor de busqueda para cualquiera de los dos apuntaré a miiltiples registros. Se deben considerar las siguientes estrategias de busqueda alternativas: 1. Suponiendo que DNO tenga un indice pero no EDAD, acceder a los registros que cum- plan DNO = 4 utilizando el indice y después seleccionar de ellos los que cumplan que EDAD = 59. 2. Alternativamente, si EDAD tiene un indice pero no DNO, acceder a los registros que cum- plan EDAD = 59 utilizando el indice y después seleccionar de ellos los que cumplan que DNO = 4. 3. Si se han creado los indices sobre los dos, DNO y EDAD, se usardn ambos; cada uno devuelve un conjunto de registros 0 un conjunto de punteros (a bloques 0 a registros). La intersec- cin de estos conjuntos de registros o punteros proporciona los registros que satisfacen las dos condiciones. Eventualmente todas estas alternativas dan el resultado correcto. Sin embargo, si el conjunto de registros que cumplen cada condicién (ONO = 4 y EDAD = 59) individualmente es grande, pero slo unos pocos registros satisfacen la condicién combinada, ninguna de las anteriores es una técnica eficiente para la peticién de busqueda dada. Existen varias posibilidades que tratarfan la combina- cién , 0 como una clave de busqueda constituida por miiltiples atri- butos. A continuacién describiremos brevemente estas técnicas. Nos referiremos a las claves que contienen multiples atributos como claves compuestas. 6.4.1. indices ordenados sobre multiples atributos El estudio que hemos realizado hasta ahora en este capitulo se aplica si creamos un indice sobre un campo clave de busqueda que sea una combinacién de . En el ejemplo anterior, la clave de biisqueda es un par de valores <4, 59>. En general, si se crea un indice sobre los atribu- tos . los valores clave de biisqueda son tuplas con n valores: < v4, 95 «5 Up> Una ordenacién lexicografica de estos valores de tuplas establece un orden sobre esta clave compuesta de busqueda. Para nuestro ejemplo, todas las claves de departamento para el ntimero de 174 6.4.2. 6.4.3. Fundamentos de sistemas de bases de datos departamento 3 preceden a las del departamento 4. Por tanto <3, n> precede a <4, m> para cualquier valor de m y n, El orden ascendente de clave para claves con DNO = 4 seria <4, 18>, <4, 19>, <4, 20>, y asf sucesivamente. La ordenacién lexicogréfica funciona de forma similar para ordenar cadenas de caracteres. Un indice sobre una clave compuesta de n atributos funciona de forma similar a cualquier {ndice explicado con anterioridad en este capitulo. Direccion: nto partido El direccionamiento partido es una extensién del direccionamiento externo estatico (Seccién 5.9.2) que permite el acceso sobre claves miiltiples. Sirve s6lo para comparaciones de igualdad; no sopor- ta consultas de rango. En el direccionamiento partido, para una clave compuesta de n componen- tes, se disefia una funcidn de direccionamiento calculado que produzca un resultado con n direccio- nes calculadas distintas. La direccién de la cubeta es una concatenacién de esas n direcciones. Asi, es posible buscar la clave compuesta de busqueda requerida examinando las cubetas apropiadas que se correspondan con las partes de Ia direccién en las que estamos interesados. Por ejemplo, consideremos la clave compuesta de bisqueda . Sia DNO y EDAD se direccionan de manera calculada con 3 y 5 bits respectivamente, tendremos una direccién de cube- ta de 8 bits. Supongamos que a DNO = 4 le corresponde la direccién «100» y a EDAD = 59 la «10101». Entonces para buscar el valor de busqueda combinado DONO = 4 y EDAD = 59, deberemos ir a la direccién de cubeta 100 10101; si s6lo buscamos todos los empleados con EDAD = 59, debe- remos examinar todas las cubetas (8 en total) cuyas direcciones sean «000 10101», «001 10101», etc. Una ventaja del direccionamiento partido es que se puede extender ficilmente a cualquier nti- mero de atributos. Las direcciones de cubetas se pueden disefiar de modo que los bits de mayor orden de la direccién correspondan a los atributos mas frecuentemente accedidos. Ademés, no es necesario mantener estructuras de acceso diferentes para atributos individuales. El principal incon- veniente del direccionamiento partido es que no puede manejar consultas de rangos sobre ninguno de los atributos componentes. Ficheros rejilla Otra alternativa es organizar el fichero EMPLEADOS como un fichero rejilla. Si queremos acceder a un fichero por dos claves, como DNO y EDAD en nuestro ejemplo, podemos construir un array rejilla con una escala lineal (0 dimensién) para cada atributo de busqueda. La Figura 6.14 muestra un array rejilla para el fichero EMPLEADOS con una escala lineal para DNO y otra para el atributo EDAD. Las escalas estén hechas de tal forma que siguen una distribucién uniforme para cada atributo. De esta manera, en nuestro ejemplo, mostramos que la escala lineal para DNO tiene DNO = 1, 2 combi- nados como un solo valor 0 de la escala, mientras que a DNO = 5 le corresponde el valor 2 de la escala. Similarmente, EDAD se divide en su escala de 0 a 5 agrupando edades para distribuir los empleados uniformemente por su edad. El array rejilla mostrado para este fichero tiene un total de 36 celdas, Cada celda apunta a alguna‘ direccién de cubeta donde estén almacenados los registros correspondientes a esa celda, La Figura 6.14 también muestra la asignacin de celdas a cubetas (slo parcialmente). Asi, nuestra peticién de DNO = 4 y EDAD = 59 se corresponde con Ia celda (1, 5) del array reji lla. Los registros de esta combinacién estardn en la cubeta correspondiente. Este método es particu- larmente til para consultas de rangos que se corresponden con un conjunto de celdas correspon- dientes a un grupo de valores de la escala lineal. Conceptualmente, el concepto de fichero rejilla se puede aplicar a cualquier némero de claves de busqueda. Para n claves de btisqueda, el array rejilla Estructuras de indices para ficheros 175. Area dea cubeta phe, Fichero empleados 7 aa Ca Area de la cubeta 9.10 Escala nes para Ono o+Neona Escala lineal para edad oti {2s ta Ts 20 [ST-25)26-B0\S1-40| 41-50] 80 Figura 6.14. Ejemplo de un array rejilla para los atributos ovo y e040. tendrfa n dimensiones. El array rejilla permite una particin del fichero a través de las dimensiones de los atributos clave de biisqueda y proporciona un acceso por combinacién de valores a través de esas dimensiones. Los ficheros rejilla funcionan bien debido a la reduccién del tiempo para acce- sos de clave miltiple. Sin embargo, necesitan mas espacio debido a la estructura del array rejilla. Es mis, con ficheros dinémicos, ademés del coste de mantenimiento se aiiade la necesidad de una frecuente reorganizacién del fichero.'° 6. Otros tipos de indices 5.5.1. Empleo del direccionamiento calculado y de otras estructuras de datos como indices También es posible crear estructuras de acceso similares a indices, basadas en el direccionamiento calculado. Las entradas de indice (0 ) se pueden organizar en forma de fichero de direccionamiento dindmicamente expansible mediante alguna de las técnicas descritas en la Seccién 5.9.3; para buscar una entrada, aplicaremos a K el algoritmo de busqueda por direcciona- miento calculado; una vez localizada la entrada, el puntero Pr (0 P) nos serviré para encontrar el registro correspondiente en el fichero de datos. También podemos usar otras estructuras de bisque- da como indices. 6.5.2. Indices légicos y fisicos Hasta ahora hemos supuesto que las entradas de indice (0 ) siempre inclu- yen un puntero fisico Pr (o P) que especifica la direccién del registro fisico en el disco en forma de un nimero de bloque y un desplazamiento. Esto se conoce como indice fisico, y tiene la des- ventaja de que el puntero debe modificarse si el registro se pasa a otro lugar del disco. Por ejem- 1 Los algoritmos de insercién/eliminacién para ficheros rejilla pueden encontrarse en Nievergelt [1984]. 176 — Fundamentos de sistemas de bases de datos plo, supongamos que la organizacién primaria de un fichero se basa en un direccionamiento calcu- lado lineal 0 extensible; entonces, cada vez que se divida una cubeta, algunos registros se asigna- rén a cubetas nuevas, y por tanto tendrdn nuevas direcciones fisicas. Si el fichero tiene un indice secundario, seré necesario encontrar y actualizar los punteros a esos registros, Io cual es una tarea complicada. A fin de remediar esta situacién, podemos usar una estructura llamada indice légico, cuyas en- tradas tienen la forma . Cada entrada tiene un valor K para el campo de indexacién se- cundaria que se corrésponde con el valor K, del campo empleado para la organizacién primaria del fichero. Si un programa busca el valor K en el indice secundario, podra localizar el valor corres- pondiente de K, y utilizarlo para tener acceso al registro valiéndose de la organizacién primaria del fichero. Los indices l6gicos por tanto introducen un nivel adicional de indireccién entre Ia estructu- ra de acceso y los datos. Se utilizan cuando se espera que las direcciones fisicas de los registros cambien con frecuencia. El costo de esta indireccién es la btisqueda adicional que se basa en la organizacién primaria del fichero. 6.5.3. Anal En muchos sistemas, el indice no es parte integral del fichero de datos, sino que puede crearse y desecharse dindmicamente. Por eso suele Hamarse estructura de acceso. Siempre que esperemos acceder frecuentemente a un fichero segin una condicién de biisqueda que implique un campo en particular, podemos solicitar al SGBD la creacién de un indice basado en ese campo. Normal- mente, se crear4 un fndice secundario con el fin de evitar la ordenacién fisica de los registros del fichero de datos en el disco. La-principal ventaja de los indices secundarios es que, por lo menos en teorfa, se pueden crear con casi cualquier organizacién primaria de registros. Por tanto, el indice secundario pue- de servir para complementar otros métodos de acceso primario, como la ordenacién o el direc cionamiento calculado, e incluso puede usarse con ficheros mixtos. Para crear un indice secunda- rio de 4rbol B+ sobre algiin campo de un fichero, deberemos examinar todos los registros del fichero y crear las entradas en el nivel de hoja de arbol. A continuacién, dichas entradas se orde- narén y Ienarén de acuerdo con el factor de lenado especificado; simultaneamente se crearn los demas niveles del indice, Resulta mas costoso y mucho mis dificil crear dinémicamente indi- ces primarios y de agrupaci6n, porque los registros del fichero de datos deben estar ordenados ffsicamente en el disco segtin el campo de indexacién. Sin embargo, algunos sistemas permiten a los usuarios crear dinémicamente estos indices en sus ficheros ordenando el fichero durante la creaci6n del indice. A menudo se utilizan los indices para imponer una restriccién de clave sobre un atributo. Cuando se busca en el indice el lugar donde se insertard un registro nuevo, resulta sencillo verificar al mismo tiempo si algiin otro registro del fichero, y por tanto del arbol de indice, tiene el mismo valor de atributo clave que el nuevo registro. Si es asi, la insercién podrd rechazarse. A un fichero que tiene un indice secundario para cada uno de sus campos suele amérsele fi- chero totalmente invertido. Como todos los indices son secundarios, los registros nuevos se inser- tan al final del fichero, y por tanto, el fichero de datos en s{ es un fichero no ordenado (de mon- ton). Los indices casi siempre se implementan en forma de drboles B+, por lo que se actualizan dindmicamente para reflejar la insercién o eliminacién de registros. Algunos SGBD comerciales, como ADABAS de Software-AG, utilizan este método. Nos referimos a la popular organizacién de ficheros de IBM Hamada ISAM en la Secci6n 6.2. Hay otro método de IBM, método de acceso de almacenamiento virtual (VSAM: Virtual Storage Access Method) que es similar a la estructura de acceso de rbol B+. Estructuras de indices para ficheros. = 177 tc} Resumen En este capitulo presentamos organizaciones de fichero en las que intervienen estructuras de acce- so adicionales, llamadas {ndices, para mejorar la eficiencia en la recuperacién de registros de un fichero de datos. Dichas estructuras de acceso pueden usarse junto con las organizaciones prima- rias de fichero que vimos en el Capitulo 5, las cuales sirven para organizar los registros del fichero en el disco. Primero analizamos tres tipos de {ndices ordenados de un solo nivel: (1) primarios, (2) de agru- pacién y (3) secundarios. Cada indice se basa en un campo del fichero. Los indices primarios y de agrupacién se construyen segiin el campo de ordenacién fisico del fichero, mientras que los indices secundarios se basan en campos que no son de ordenaci6n. El campo de un indice primario debe ser ademés una clave del fichero, cosa que no sucede con un indice de agrupacién. Los indices de un solo nivel son ficheros ordenados y se examinan con una busqueda binaria. Mostramos cémo se construyen indices multinivel para mejorar la eficiencia de las biisquedas. Después explicamos la implementacién de los indices multinivel como drboles B y B*, que son estructuras dindmicas que permiten al indice expandirse y contraerse dinémicamente. Los no- dos (bloques) de estas estructuras de indice se mantienen ocupados entre el 50 y el 100 por cien de su capacidad mediante sus algoritmos de insercién y eliminacién. Después de cierto tiempo, los nodos se estabilizan en un grado de ocupacién medio del 69 por ciento lo que deja espacio para hacer inserciones sin tener que reorganizar el indice en la mayor parte de éstas. En general, los arbo- Jes B* pueden contener més entradas en sus nodos internos que los arboles B, por lo que es posible que un 4rbol B* tenga menos niveles o incluya més entradas que el arbol B correspondiente. Explicamos los métodos de acceso de clave miiltiple, y mostramos la forma de construir un indice baséndonos en estructuras de datos de direccionamiento calculado. A continuacién, presen- tamos el concepto de indice l6gico, comparandolo con los indices fisicos antes descritos, Por ulti- mo, vimos la forma de utilizar combinaciones de las organizaciones anteriores. Por ejemplo, los indices secundarios suelen usarse con ficheros mixtos, asf como con ficheros ordenados y no orde- nados. También se pueden crear indices secundarios para ficheros de direccionamiento calculado y ficheros de direccionamiento calculado dinémico. Preguntas de repaso 6.1. Defina los siguientes términos: campo de indexacién, campo de clave primaria, campo de agrupacién, campo de clave secundaria, ancla de bloque, indice denso, € indice no denso (disperso). 6.2. {Qué diferencias hay entre los indices primarios, secundarios y de agrupacién? ,De qué manera afectan dichas diferencias a las formas de implementar esos indices? ;Cudles de esos indices son densos, y cudles no? 6.3. {Por qué no podemos tener més de un indice primario o de agrupacién de un fichero, pero si varios indices secundarios? 6.4, {Cémo mejora la indexacin multinivel la eficiencia de las bisquedas en un fichero de {n- dice? 6.5. {Qué es el orden p de un Arbol B? Describa la estructura de los nodos de los drboles B. 6.6. {Qué es el orden p de un Arbol B*? Describa la estructura de los nodos internos y de los nodos hoja de los arboles B*. 6.7. {Qué diferencia hay entre un Arbol B y un arbol B*? ,Por qué suelen preferirse los drboles B® como estructuras de acceso a los ficheros de datos? 178 Fundamentos de sistemas de bases de datos 6.8. 6.9. 6.10. 6.11. 6.12, 6.13. Ejercicios 6.14, Explique las alternativas existentes para acceder a un fichero baséindonos en claves milti- ples de busqueda, {Qué es el direccionamiento calculado partido? ;Cémo funciona? {Cudles son sus limita- ciones? {Qué es un fichero rejilla? ,Cudles son sus ventajas y desventajas? Muestre un ejemplo de construccién de un array rejilla sobre dos atributos de cualquier fi- chero. {Qué es un fichero totalmente invertido? {Qué es un fichero secuencial indexado? Cémo podemos usar el direccionamiento calculado para construir un indice? {Qué dife- rencia hay entre un fndice I6gico y uno fisico? Considere un disco con bloques de B = 512 bytes. Un puntero a bloque tiene P = 6 bytes de longitud, y un puntero a registro tiene Py = 7 bytes de longitud. Un fichero tiene 30.000 registros EMPLEADO de longitud fija. Cada registro tiene los siguientes campos: NOMBRE (30 bytes), NSS (9 bytes), CODIGODEPTO (9 bytes), DIRECCION (40 bytes), TELEFONO (9 bytes), FECHANAC (8 bytes), SEXO (1 bytes), CODIGOPUESTO (4 bytes), SALARIO (4 bytes, ntimero real). Se utiliza un byte adicional como marcador de eliminacién.. a) Calcule el tamajio de registro R en bytes. b) Calcule el factor de bloques, fbl, y el ntimero de bloques, b, que tiene el fichero, supo- niendo que haya una organizacién no extendida. ©) Suponga que el fichero est ordenado segtin el campo clave NSS y que deseamos cons- truir un indice primario sobre el NSS. Calcule (i) el factor de bloques del indice bl; (que también es el abanico del indice fo); (ii) el ntimero de entradas y de bloques del primer. nivel del indice; (iii) el mimero de niveles que necesitaremos si lo convertimos en un indice multinivel; (iv) el néimero total de bloques que requiere el indice multini- vel, y (v) el ntimero de accesos a bloque necesarios para buscar y recuperar un registro del fichero (dado su valor de NSS) empleando el indice primario. d) Suponga que el fichero no est4 ordenado segin el campo clave NSS y que deseamos construir un fndice secundario sobre dicho campo. Repita el ejercicio anterior (parte c) para el indice secundario y haga una comparacién con el {ndice primario. ¢) Suponga que el fichero no esta ordenado segiin el campo no clave CODICODEPTO y que deseamos construir un indice secundario sobre dicho campo, eligiendo la opcién 3 de Ja Seccién 6.1.3, con un nivel de indirecci6n adicional que almacene punteros a regis- tros. Suponga que hay 1.000 valores distintos de CODIGODEPTO y que los registros de EWPLEADO estén distribuidos de manera uniforme entre esos valores. Calcule (i) el fac- tor de bloques del indice bl; (que también es el abanico del indice fo); (ii) el mimero de bloques necesarios para el nivel de’ indireccién que almacena punteros a registros; (iii) el méimero de entradas y de bloques de primer nivel del indice; (iv) el mimero de niveles que necesitaremos si lo convertimos en un indice multinivel; (v) el mimero to- tal de bloques que requiere el indice multinivel y el nivel adicional de indireccién, y (vi) el mimero aproximado de accesos a bloque necesarios para buscar y recuperar to- dos los registros del fichero que tienen un determinado valor de CODIGODEPTO, em- pleando el indice. f) Suponga que el fichero esté ordenado segiin el campo no clave CODIGODEPTO y que de- seamos construir un éndice de agrupacién sobre dicho campo que use anclas de bloque (cada nuevo valor de CODIGODEPTO comienza al principio de un nuevo bloque). Supon- 6.15. 6.16. 6.17. 6.18, 6.19. 6.20. Estructuras de indices para ficheros 179 ga que hay 1.000 valores distintos de CODIGODEPTO y que los registros de EMPLEADO es- tan distribuidos de manera uniforme entre esos valores. Calcule (i) el factor de bloques del indice fbl; (que también es el abanico del indice fo); (ii) el ntimero de entradas y de bloques de primer nivel del fndice; (iii) el nimero de niveles que necesitaremos si lo convertimos en un indice multinivel; (iv) el nimero total de bloques que requiere el indice multinivel, y (v) el ntimero de accesos a bloque necesarios para buscar y recupe- rar todos los registros.del fichero que tienen un determinado valor de CODIGODEPTO, empleando el indice de agrupacién (suponga que los bloques-miltiples de una cubeta son contiguos). 2) Suponga que el fichero no esta ordenado segiin el campo clave NSS y que deseamos construir una estructura de acceso (indice) de arbol B* sobre NSS. Calcule (i) los érde- NS P Y Pyojg del Arbol B*; (ji) el nimero de bloques en el nivel de hoja requeridos si los bloques estén ocupados aproximadamente al 69 por ciento de su capacidad (redon- deando hacia arriba por comodidad); (iii) el ntimero de niveles requeridos si los nodos internos también estén ocupados al 69 por ciento (redondeando hacia arriba por como- didad); (iv) el nimero total de bloques que ocupa el drbol B*, y (v) el nimero de acce- sos a bloque necesarios para buscar y recuperar un registro del fichero (dado su valor de Nss) empleando el 4rbol B* h) Repita el apartado g, pero con un 4rbol B en vez de un 4rbol B*. Compare los resulta- dos de los dos casos. Un fichero COMPONENTES con NimComp como campo clave contiene registros con los siguientes valores de NimComp: 23, 65, 37, 60, 46, 92, 48, 71, 56, 59, 18, 21, 10, 74, 78, 15, 16, 20, 24, 28, 39, 43, 47, 50, 69, 75, 8, 49, 33, 38. Suponga que los valores del campo de biisqueda estan insertados en este orden en un drbol B* de orden p = 4 y Phoja = 3; indique la forma en que se expandiré el érbol y muestre el aspecto final que tendrd. Repita el Ejercicio 6.15, pero utilice un drbol B de orden p = 4 en vez de un 4rbol B*. Suponga que se eliminan, en el orden dado, los siguientes valores del campo de busqueda del arbol B* del Ejercicio 6.15; indique como se contraeré el Arbol y muestre el Arbol final. Los valores eliminados son 65, 75, 43, 18, 20, 92, 59; 37. Repita el Ejercicio 6.17, pero con el érbol B del Ejercicio 6.16. El Algoritmo 6.1 representa el procedimiento para efectuar una biisqueda en un fndice pri- mario multinivel no denso con el fin de recuperar un registro del fichero. Adapte el algorit- mo a cada uno de los siguientes casos: a) Un {ndice secundario multinivel sobre un campo no clave que no es el campo de orde- nacién de un fichero. Suponga que se usa la opcidn 3 de la Seccién 6.1.3, donde un nivel adicional de indireccién almacena punteros a los registros individuales que tienen el valor del campo de indexacién correspondiente. b) Un indice secundario multinivel sobre un campo clave que no es el campo de ordena- cién de un fichero. c) Un indice de agrupacién multinivel sobre un campo no clave que sf es el campo de ordenacin de un fichero. Suponga que un fichero tiene varios indices secundarios sobre campos no clave, implemen- tados empleando la opcién 3 de la Seccién 6.1.3; por ejemplo, podriamos tener indices se- cundarios segtin los campos CODIGODEPTO, CODIGOPUESTO y SALARIO del fichero EMPLEADO del Ejercicio 6.14. Describa una manera eficiente de buscar y recuperar los registros que satisfagan una condicién de seleccién compleja expresada sobre esos campos, como (CODIGODEPTO = 5 Y CODIGOPUESTO = 12 Y SALARIO = 50.000), empleando los punteros a registros del nivel de indireccién. 180 Fundamentos de sistemas de bases de datos 6.21, 6.22. 6.23. 6.24, | eee A a Insert desbordamiento 19) [o} (nuevo nivel) Y I 1 ‘3 ]o} +15 Jo} 8 [ol[ 9 ple} [12]o] Insertar 6: ee je) 7 lel (divisién) a 3 ifs ne A | ' N\ 13 aa _ [ES Figura 6.15. Insercién en un érbol B* con redistribucién a la izquierda. Adapte los Algoritmos 6.2 y 6.3, que representan procedimientos de busqueda ¢ insercién en un 4rbol B*, a un arbol B. Es posible modificar el algoritmo de insercién en un drbol B* a fin de postergar el caso en el que se produce un nuevo nivel verificando si es factible una redistribucién de los valores entre los nodos hoja. La Figura 6.15 ilustra la forma en que esto podria hacerse para nuestro ejemplo de la Figura 6.12; en vez de dividir el nodo hoja del extremo izquierdo cuando se inserta el 12, efectuamos una redistribucién a la izquierda pasando el 7 al nodo hoja que esta su izquierda (si hay espacio en ese nodo). La Figura 6.15 muestra el aspecto que tendrfa el arbol si se considera la redistribucién. También es posible considerar una redis- tribucion a la derecha, Trate de modificar el algoritmo de insercién en un arbol B* de modo que tenga en cuenta la redistribucién. Construya un algoritmo que elimine entradas de un Arbol B*. Repita el Ejercicio 6.23 para un drbol B. Estructuras de indices para ficheros 181 Bibliografia seleccionada Bayer y McCreight (1972) define los arboles B y los algoritmos asociados. Comer (1979) propor- ciona un excelente estudio de los Arboles B, su historia y variaciones. Knuth (1973) proporciona un andlisis detallado de varias técnicas de biisqueda, incluyendo los 4rboles B y algunas de sus varia- ciones. Nievergelt (1974) analiza el uso de arboles de busqueda binaria para la organizacién de ficheros. Libros de texto sobre estructuras de fichero como Wirth (1972), Claybrook (1983), Smith y Barnes (1987), Miller (1987) y Salzberg (1988) explican la indexacién con detalle y pueden con- sultarse para algoritmos de busqueda, insercién y eliminacién en Arboles B y B*. Larson (1981) analiza los ficheros secuenciales indexados, y Held y Stonebraker (1978) comparan los {ndices multinivel estéticos con los indices dinémicos de 4rbol B. Lehman y Yao (1981) y Srinivasan y Carey (1991) hicieron un andlisis de accesos concurrentes a Arboles B. Los libros de Wiederhold (1983), Smith y Barnes (1987) y Salzberg (1988), entre otros, tratan algunas de las técnicas descri- tas en este capitulo. Los ficheros rejilla se explican en Nievergelt (1984). La recuperacin por co- rrespondencia parcial, que usa direccionamiento partido se explica en Burkhard (1976, 1979). En Lanka y Mays (1991), Zobel et al. (1992) y Faloutsos y Jagadish (1992) se explican nuevas técni- cas y aplicaciones de los indices y arboles B*. Mohan y Narang (1992) tratan de la creacién de indices. Baeza-Yates y Larson (1989) y Johnson y Shasha (1993) analizan el desarrollo de varios algoritmos de arboles B y B*. Chan et al. (1992) explican la gestién de biiferes para indices.

You might also like