Universidad Central de Venezuela Facultad de Ciencias Escuela de Computación ADMINISTRACIÓN DE BASES DE DATOS María Gertrudis López López Centro de investigación en Sistemas de Información CISI. 1 ADMINISTRACIÓN DE BASES DE DATOS Resumen La administración de las capacidades de la base de datos de una manera efectiva y eficaz proporciona un producto de calidad. El resultado final de los esfuerzos será una base de datos seria, robusta, segura, ampliable y diseñada para cumplir los objetivos de las aplicaciones a las que dé servicio. Existen una serie de componentes que forman parte de estos objetivos y que aquí vamos a analizar con detenimiento. Unas arquitecturas física y lógica de la base de datos bien diseñadas ayudan a mejorar el rendimiento y facilitan la administración, al distribuir adecuadamente sus objetos. Si se determina cual es el número y el tamaño correcto de los objetos de la base de datos, ésta podrá dar servicios a todas sus transacciones. También se presentan las estrategias de optimización, seguridad y supervisión, así como procedimientos de recuperación y copia de seguridad óptimos, para asegurar la restauración de la base de datos ante cualquier falla. De igual forma, es importante los mecanismos de control de concurrencia, ya que éstos pueden afectar tanto a la cantidad como a la ejecución de las transacciones que se ejecutan en un momento dado. Ninguno de los objetivos anteriores se lograría sin el concepto de diccionario de datos que es el encargado de almacenar las descripciones de los objetos de la base de datos. Palabras claves: Administrador de Bases de datos, esquema interno, transacciones, concurrencia, optimización, diccionario de datos, seguridad, integridad. ——————————— Centro de Información en Sistemas de Información -CISIEscuela de Computación Facultad de Ciencias Universidad Central de Venezuela Los Chaguaramos. Apartado 47002Caracas 1041-A Venezuela 2 INDICE INDICE ______________________________________________________________ 3 INTRODUCCIÓN ______________________________________________________ 4 1. Estructura Interna de los SMBD_______________________________________ 5 1.1. Manejo de Memoria[1] __________________________________________ 5 1.1.1. Acceso a bases de datos: Panorama General ______________________ 5 1.1.2. Clustering [5] ______________________________________________ 7 1.1.3. Organización de Archivos [5]__________________________________ 7 1.1.3.1. Organización Secuencial__________________________________ 7 1.1.3.2. Organización Directa ____________________________________ 8 1.1.3.3. Organización Indexada ___________________________________ 9 1.1.3.3.1. Organización aleatoria indexada _________________________ 10 1.1.3.3.2. Organización indexada secuencial _______________________ 11 1.1.3.3.2.1. Manejador de archivos de datos con una organización indexada secuencial 12 1.1.4. Estructuras de Datos ________________________________________ 14 1.1.4.1. Listas Invertidas _______________________________________ 14 1.1.4.2. Listas Enlazadas _______________________________________ 15 1.1.4.3. Árboles B ____________________________________________ 16 1.1.4.4. Árboles B+ ___________________________________________ 17 1.2. Casos de Estudio [12, 13] _______________________________________ 18 1.2.1. Sybase ___________________________________________________ 18 1.2.2. Oracle ___________________________________________________ 18 7. REFERENCIAS BIBLIOGRAFICAS _________________________________ 21 3 INTRODUCCIÓN Actualmente, la información es una de los recursos mas importantes que posee cualquier organización. Es por ello, que la tecnología ha evolucionado a sistemas que almacenan y recuperan la información de manera eficiente. El campo de base de datos ha sufrido muchos cambios hasta el día de hoy. En un principio se tenían sistemas de procesamiento de archivos, los cuales eran limitados por la fuerte dependencia entre los formatos de los archivos y los programas. A raíz de estos surgen los sistemas manejadores de bases de datos, los cuales poseen muchas ventajas como son: la minimización de redundancia, control de concurrencia, recuperación en caso de falla, etc. Los primeros sistemas manejadores de bases de datos estaban basados en estructuras jerárquicas y de red, pero debido a su complicación surgen los modelos relacionales, que son usados ampliamente en la actualidad. Todo este gran volumen de datos que almacenan las bases de datos es administrador por un grupo de personas denominadas Administrador de Bases de Datos (ABD). Es labor del ABD: • Definir los esquemas de la bases de datos, por lo cual es importante conocer las diversas estructuras de almacenamiento que permiten una recuperación eficiente. La información de los esquemas es almacenada en el diccionario de la base de datos. • Proveer mecanismos de backup/restore que permitan la recuperación de la base de datos ante cualquier particularidad. • Garantizar que el acceso concurrente de múltiples usuarios no comprometa la integridad de la base de datos. • Garantizar un tiempo razonable de respuesta ante la ejecución de cualquier consulta, por lo que es importante la optimización de consultas. • Proveer mecanismos de seguridad que permitan el acceso a los datos solo a personas autorizadas. • Proveer mecanismos de integridad que representen restricciones que deben cumplirse sobre los datos. En este documento estudiaremos cada una de las funciones que efectúa un ABD. 4 1. Estructura Interna de los SMBD 1.1. Manejo de Memoria[1] El nivel interno de un sistema de bases de datos es el que se ocupa de la forma como están almacenados los datos. Físicamente, las bases de datos casi siempre se almacenan en medios de acceso directo, por lo regular en discos magnéticos de cabeza móvil, aunque en algunos sistemas pueden utilizarse otros medios (por ejemplo tambores, discos ópticos, etc.) en vez de esos discos o además de ellos. Daremos por sentado que se conocen los aspectos básicos de la arquitectura de los discos y se conocen términos tales como tiempo de búsqueda, retardo rotacional, cilindro, pista, cabeza de lectura / grabación, etc. [2, 3] Lo fundamental en un ambiente de base de datos es que los tiempos de acceso a disco son mucho más largos que los tiempos de acceso a memoria principal. Los tiempos de acceso a disco representativos van de cerca de 400 milisegundos o más para un disco flexible en un micro hasta unos 30 milisegundos o menos para un disco rápido en un mainframe; el acceso a memoria principal será con toda probabilidad por lo menos cuatro o cinco órdenes de magnitud más rápido que el acceso a disco en un sistema dado. Por todo esto, un objetivo prioritario de desempeño en sistemas de bases de datos es reducir al mínimo el número de accesos a disco. Para esto se utilizan técnicas para organizar los datos almacenados en disco de manera tal que un elemento de información requerido se pueda localizar con un mínimo de operaciones de E/S. Cualquier organización de los datos en el disco se denomina estructura de almacenamiento. Es posible desarrollar (y así se ha hecho) un gran número de estructuras de almacenamiento diferentes, y desde luego, tienen distintas características de desempeño que son adecuadas para ciertas aplicaciones y no lo son para otras. No existe una sola estructura óptima para todas las aplicaciones por lo que un buen sistema debe poder utilizar varias estructuras distintas, a fin de almacenar diversas porciones de la base de datos en diversas formas y deberá ser posible cambiar la estructura de almacenamiento de una porción determinada cuando varíen o se comprendan mejor los requerimientos de desempeño. 1.1.1. Acceso a bases de datos: Panorama General Localizar un elemento de información específico en la base de datos y presentarlo al usuario requiere varios niveles de programas para acceso a los datos y sus principios generales pueden explicarse en base a la figura 1: 1. En primer término, el SMBD decide cuál registro almacenado se necesita, y pide al manejador de archivos que extraiga ese registro. 2. A su vez, el manejador de archivos decide cuál página contiene el registro deseado y pide al manejador de disco que lea esa página. La página es la unidad de E/S, es decir, la cantidad de datos transferidos entre el disco y la memoria principal en un sólo acceso a disco (1K, 2K, 4Kbytes, etc.) 3. Por último, el manejador de disco determina la localización física de la página deseada en el disco y realiza la operación de E/S necesaria. Si la página ya esta en memoria principal porque ha sido leída anteriormente no es necesario volverla a leer de disco. 5 Figura 1 Manejador de disco: Es un componente del sistema operativo subyacente encargado de todas las operaciones físicas de E/S. Como tal, es evidente que necesite conocer las direcciones físicas en el disco. Por ejemplo, cuando el manejador de archivos solicita la lectura de una página p, el manejador de disco necesita saber con exactitud donde está situada esa página en el disco físico. Para el manejador de archivos, el disco es una colección lógica de conjuntos de páginas, cada uno de los cuales se compone de un grupo de páginas de tamaño fijo. Cada conjunto de páginas se identifica mediante un identificador de conjunto de páginas único. Cada página a su vez, se identifica mediante un número de página que es único dentro del disco; los diferentes conjuntos de páginas no se solapan, es decir, no tienen páginas en común. El manejador de disco entiende y mantiene la correspondencia entre números de página y direcciones físicas en el disco. Uno de los conjuntos de páginas, el conjunto de páginas de espacio libre, sirve como reserva de páginas disponibles. El manejador de disco se encarga de la asignación de páginas a los conjuntos y la liberación de páginas de los mismos cuando se los solicita el manejador de archivos. Entre las operaciones que puede realizar el manejador de disco con los conjuntos de páginas (que son las operaciones que puede solicitar el manejador de archivos) se encuentran: - Leer la página p del conjunto C. - Reemplazar la página p dentro del conjunto de página C. - Añadir una página nueva al conjunto de páginas C (es decir, obtener una página vacía del conjunto de páginas del espacio libre y devolver el nuevo número de página p). - Eliminar la página p del conjunto de páginas C (es decir, volver la página p al conjunto de páginas del espacio libre). Manejador de archivos: Utiliza los recursos del manejador de disco de manera tal que su usuario (el SMBD) puede percibir al disco como un conjunto de archivos almacenados. Cada conjunto de páginas contendrá uno o más archivos almacenados. Cada archivo almacenado se identifica mediante un nombre de archivo o identificador de archivo único por lo menos dentro del conjunto de páginas que lo contiene, y cada registro almacenado, a su vez, se identifica, mediante un número de registro o identificador de registro único al menos dentro del archivo 6 almacenado que lo contiene (En la práctica, los identificadores de registro suelen ser únicos no sólo dentro del archivo que los contiene sino dentro de todo el disco, ya que por lo general se componen de un valor de número de página y algún valor único dentro de esa página). En alguno sistemas, el manejador de archivos es un componente del sistema operativo subyacente (que en muchos casos no resulta ideal para el SMBD), en otros casos está empacado con el SMBD [4]. Entre las operaciones que puede realizar el manejador de archivos con los archivos almacenados son: - Leer el registro almacenado r del archivo almacenado A. - Reemplazar el registro almacenado r dentro del archivo almacenado A. - Añadir al archivo almacenado A un nuevo registro y devolver el nuevo identificador del registro r. - Eliminar el registro almacenado r del archivo almacenado A. - Crear un nuevo archivo almacenado A. - Destruir el archivo almacenado A. Con estas operaciones primitivas de manejo de archivos, el SMBD es capaz de construir y manipular las estructuras de almacenamiento. 1.1.2. Clustering [5] Clustering es un proceso de agrupación de registros en páginas de disco basado en patrones de uso. En un ambiente de base de datos, cada página puede contener diferentes tipos de registros lógicos. Se puede querer colocar en una misma página de disco o en una página cercana aquellos registros que son frecuentemente usados juntos con objeto de minimizar los accesos a disco. Existen dos tipos de clustering: - Clustering intra archivos: En este caso el clustering se aplica sobre archivos individuales. Si los registros de un archivo son frecuentemente accesados según el orden de algún campo del mismo, entonces es conveniente agrupar a los registros según el valor de ese campo. - Clustering ínter archivos: En este caso el clustering aplica sobre varios archivos. Si cada vez que se acceda un registro de tipo 1 se accedan todos los registros tipo 2 asociados con él entonces es recomendable agrupar cada registro tipo 1 con todos los registros tipo 2 asociados a él. 1.1.3. Organización de Archivos [5] La organización de archivos se refiere a la estructura física de un archivo sobre el disco. Los tres métodos de organización de archivos disponibles son: secuencial, directo e indexado. Cada una de estas organizaciones es usada por el SMBD en alguna forma. La organización secuencial es usada para archivos journal; para copias de backup de la BD; para ciertos archivos que sirven como entrada a aplicaciones batch; para archivos de transacciones batch, etc. Las organizaciones directas e indexadas son técnicas usadas por el SMBD para el almacenamiento de data dentro de la base de datos. Una organización de archivos, junto con las posibles técnicas de acceso para esa organización constituye un método de acceso. Una técnica de acceso define los pasos involucrados en el almacenamiento y la recuperación de registros específicos a través de acceso secuencial o aleatorio a dicho registro. 1.1.3.1. Organización Secuencial En este tipo de organización, los registros son almacenados en la secuencia física en la que ellos van a ser procesados. Existen dos tipos posibles de organización secuencial. Si los registros son almacenados sin ningún orden específico sino sólo por su orden cronológico de llegada el archivo correspondiente es una pila. Los archivos journal, los backups, los archivos de transacciones batch son del tipo pila. El segundo tipo de organización secuencial es aplicable en un ambiente de procesamiento de archivos, donde un gran porcentaje de los registros necesitan ser accesados frecuentemente. Un archivo con este tipo de organización secuencial tiene todos sus registros almacenados según el valor de una clave que es normalmente la clave primaria. 7 Con un archivo organizado secuencialmente sólo se puede usar acceso secuencial. El acceso aleatorio no es posible. Si un registro específico va a ser consultado desde el archivo, todos los registros que lo preceden físicamente deben ser recuperados antes de obtenerlo a él. Por esto, la organización secuencial no es recomendable para un ambiente en línea donde se requiere un acceso rápido. En un archivo con este tipo de organización, los registros pueden ser añadidos sólo al final del archivo. Cuando se actualiza la información de un registro existente, puede ser actualizado y reescrito en el mismo lugar físico en el que se encontraba. Pero si se debe insertar un nuevo registro que va en la mitad del archivo, el archivo completo debe ser recopiado a una nueva localización física donde se coloca adecuadamente el nuevo registro. El borrado físico de un registro existente también requiere que el archivo sea recopiado a una nueva localización física donde no se encuentra el registro borrado. Comparada con la organización directa e indexada, la organización secuencial hace un uso más económico del disco ya que no se requieren almacenar estructuras físicas adicionales para acceder los registros y el archivo se mantiene tan compacto como se puede. 1.1.3.2. Organización Directa La organización directa da un performance excepcional en un ambiente on-line, donde se requiere acceso aleatorio. En la organización directa, cada registro es almacenado y recuperado en una dirección de disco sobre la base de una fórmula que es aplicada a un valor de un campo del registro. Son posibles dos tipos de organización directa, una usando técnicas de direccionamiento en base a una clave y la otra usando técnicas hashing. Técnicas de direccionamiento por clave: Con estas técnicas una fórmula es aplicada al valor del campo que es la clave primaria del registro y se obtiene un número relativo de registro único. Por ejemplo, se tienen las siguientes ocurrencias del tipo registro EMPLEADO donde la clave primaria es el número de empleado: Emp 5 Emp 7 Emp 9 Emp 11 Emp 13 Emp 15 Emp 17 Emp 19 Emp 21 La fórmula a aplicar sobre cada valor de número de empleado es: (NUMEMP - 3) / 2. Por ejemplo para el empleado 19 el resultado de la fórmula sería 8. Entonces, cada valor de clave primaria da como resultado un número relativo de registro único a ser usado. Sólo se necesita un acceso al archivo para almacenar o recuperar un registro específico. La rapidez provista por esta técnica constituye una ventaja con respecto a la organización secuencial. En la mayoría de los casos donde se aplica esta técnica, se observa una gran dispersión entre las direcciones relativas generadas y las posiciones de memoria deben ser reservadas aunque no sean usadas. Usualmente se debe hacer un estudio comparativo entre velocidad de acceso y espacio de almacenamiento en disco necesario cuando se usa esta técnica y a menos que se tenga una clave primaria que pueda ser convertida en un conjunto compacto de números relativos, la técnica de direccionamiento por clave no es una buena selección para una organización directa ya que aunque es un método de acceso rápido, puede dejar muchos huecos, lo que desperdicia espacio en disco. Técnicas Hashing: Son similares a las de direccionamiento por clave en que la fórmula es aplicada a un campo del registro (usualmente la clave primaria) teniendo como resultado un valor usado como la dirección en disco para almacenar ese registro. La diferencia es que las técnicas hashing no garantizan una dirección de almacenamiento única. La fórmula puede producir dos o más registros con el mismo valor resultante. Esta técnica permite utilizar el disco eficientemente mientras intenta retener la rapidez del acceso aleatorio (no más de un acceso a disco para obtener un registro específico) si se pueden minimizar los efectos de los resultados duplicados de la fórmula. La función hashing es seleccionada de manera tal que los registros sean esparcidos lo más uniformemente posible a lo 8 largo de todo el archivo, pero no quedan almacenados en una secuencia en particular. Cuando para dos o más registros se obtiene como resultado el mismo valor de la función hashing se dice que se produce una colisión y los dos registros son llamados sinónimos. Dentro de las técnicas hashing más usadas se tienen: Técnica hashing plegable (folding): Consiste en tomar el valor de la clave primaria, dividir sus dígitos en dos o más grupos y sumar estos grupos de dígitos. El resultado de la suma es usado como la dirección en disco. La idea es tomar un valor de clave primaria que puede ser grande (C.I., por ejemplo) y transformarlo en números pequeños que son direcciones en disco minimizando el número de colisiones a obtener. Técnica hashing división-cociente: Consiste en dividir el valor de la clave primaria entre un número fijo, preseleccionado y el cociente de la división se usa como dirección en disco. Las investigaciones demuestran que el número seleccionado para hacer la división debe ser un número primo para disminuir el número de colisiones posibles. Manejo de colisiones: No importa lo bien seleccionado que esté nuestra función hashing, siempre habrá que enfrentar el problema de las colisiones y se debe buscar la mejor forma de manejarlo. Se sabe que el SMBD almacena registros en páginas que tienen capacidad para varios registros y que cada página tiene un número único o dirección. Mas que usar un número relativo para almacenar y recuperar registros, la técnica hashing usa el número de página para localizar los registros. Entre las formas de manejar las colisiones se tienen: Búsqueda lineal: Si la página en donde se debe almacenar un registro nuevo, según la función hashing, no tiene espacio disponible, este se almacena en la próxima página que tenga espacio disponible. La ventaja de este método es que los registros que tengan la misma página estarán almacenados en la misma página o en páginas cercanas pero si existen muchos registros que deben estar en una misma página y no caben allí se necesitarán varios accesos a disco para obtenerlos y el problema puede empeorarse para archivos de gran tamaño con altas densidades de ocupación. Áreas de overflow: Este método usa un área de overflow separada para almacenar los registros que no pueden ser almacenados en la página especificada por la función hashing. Al momento de ubicar un registro que está en al área de overflow, el sistema obtiene primero la página en donde debería estar almacenado. Al no ser encontrado allí se comienza a obtener las páginas del área de overflow hasta que el registro es encontrado. El método de búsqueda lineal tiende a causar colisiones a futuros registros que tengan que ser ubicados en la página en la que ubico el registro sinónimo y si se mantienen el número de colisiones al mínimo, es más rápido buscar en una área de overflow pequeña que buscar en el área primaria. La eficiencia de ambos métodos puede ser mejorada a través del uso de una cadena de apuntadores (cadena de sinónimos o colisiones). Para esto cada página tiene un campo, llamado apuntador, que sirve como indicador de que una colisión ha ocurrido en esa página. En este campo se almacena el número de página en donde se encuentra almacenado el sinónimo. De este forma no es necesario hacer una búsqueda secuencial en el área primaria para el método de búsqueda lineal o no es necesario buscar en todas las páginas del área de overflow para el método de áreas de overflow. En general, el rendimiento de una técnica hashing específica en una aplicación dada depende de ciertos factores tales como: - Las características de la clave primaria usada como base de la función hashing. - La función hashing seleccionada - La técnica de manejo de colisiones seleccionada. - El tamaño de la página. Las páginas grandes tienden a disminuir el número de colisiones. - La densidad de ocupación de la página. Si es muy alta (>80%) aumenta la probabilidad de colisiones. Si es muy baja (< 40%) se desperdicia espacio en disco. 1.1.3.3. Organización Indexada La organización indexada provee acceso eficiente a los registros de ambas formas, tanto secuencialmente como aleatoriamente; los registros lógicos son almacenados en un archivo llamado archivo de datos y existe un archivo separado llamado archivo índice que contiene registros formados por el valor clave y la dirección del registro lógico que tiene ese valor de 9 clave. Se dice entonces que el archivo de datos está indexado por el archivo índice. Muchos S.O. restringen el tipo de archivos índices permitidos a aquellos definidos sobre valores únicos o claves primarias, estos son llamados índices primarios, sin embargo también pueden permitir definir índices sobre una clave secundaria no única. Estos son llamados índices secundarios. En general existen dos tipos de organización indexada posibles: Organización aleatoria indexada y organización secuencial indexada. 1.1.3.3.1. Organización aleatoria indexada En este tipo de organización los registros en el archivo de datos están almacenados de manera aleatoria y en el archivo índice existe una entrada por cada registro lógico existente en el archivo de datos (este tipo de archivo índice se conoce como archivo denso) almacenados según el orden de la clave primaria. Un ejemplo de este tipo de organización es mostrado en la siguiente figura: Archivo índice Archivo de Datos Clave Dirección (Nro. De Pág.) Registro Página 124 2 Empleado 405 Empleado 256 Página 1 256 1 Empleado 311 311 1 Empleado 611 315 3 Empleado 124 Página 2 405 1 Empleado 567 412 3 522 3 Empleado 522 567 2 Empleado 412 Página 3 611 2 Empleado 315 Los nueve registros del archivo empleado están almacenados en el archivo de datos y el archivo índice tiene una entrada por cada una de las entradas en el archivo de datos. Cada registro en el archivo índice contiene un NUM-EMP, que es la clave primaria del registro Empleado, y un número de página, que indica donde está almacenado ese registro en el archivo de datos. El tener un archivo índice implica requerimientos de espacio adicionales para poder almacenar un registro. ¿Por qué es necesario este overhead? Una razón es para permitir el acceso secuencial de los registros lógicos. Los registros lógicos en el archivo de datos no están almacenados según el orden de la clave primaria, pero los registros del archivo índice si lo están. Entonces, al buscar los registros Empleado según el orden del archivo índice, se están accediendo los registros Empleado según el orden de la clave primaria. Un segundo beneficio de la organización indexada es que se pueden acceder aleatoriamente los registros mucho más rápido que sin usar el archivo índice. Sin el archivo índice se tendría que buscar directamente en el archivo de datos de manera secuencial el registro deseado. Como los registros de este archivo son mucho más grandes que los registros del archivo índice, el hacer la búsqueda directa en el archivo de datos es mucho más lento que hacerla en el archivo índice. Además, si una gran porción del archivo índice cabe en memoria principal, la búsqueda secuencial se puede hacer en memoria principal y se requerirán un número mínimo de accesos a disco (en caso de que el archivo índice no quepa completo en memoria principal) para tal fin y se pueden usar métodos de búsqueda más rápidos sobre el archivo índice como la búsqueda binaria, para así reducir aún más el tiempo de búsqueda de un registro específico. Una ventaja adicional de este tipo de organización es que no se necesita acceder el archivo de datos para saber si existe un registro con una clave primaria dada ya que esto lo podemos saber buscando en el índice únicamente. Una ventaja final de usar un archivo índice de este tipo para realizar acceso aleatorio se obtiene cuando los archivos de datos contienen una gran cantidad de registros lógicos. El archivo índice crece a la misma rata que la del archivo de datos porque existe una entrada en el archivo índice por cada entrada en el archivo de datos. El tiempo de búsqueda se incrementa pero no es comparable con el tiempo de búsqueda que se emplearía si esta actividad se realizará directamente sobre el archivo de datos. Adicionalmente, una vez que el archivo índice 10 ha crecido hasta un punto tal que no cabe completo en memoria principal, se puede tratar como se trata al archivo de datos y se crea un índice al índice teniéndose así un archivo índice con varios niveles de indexación o índice multinivel. Un ejemplo de este caso se muestra en la siguiente figura: Nivel 1 del índice Clave Dirección 315 7 567 8 611 9 Nivel 2 del índice Clave Dirección 124 2 256 1 311 1 315 3 405 1 412 3 522 3 567 2 611 2 Página 8 Archivo de Datos Registro Página Empleado 405 Empleado 256 Página 1 Empleado 311 Empleado 611 Empleado 124 Página 2 Empleado 567 Página 9 Empleado 522 Empleado 412 Página 3 Empleado 315 Página Página 7 El nivel 2 (índice de bajo nivel) es igual al índice original y el nivel 1 (índice de alto nivel) es el nuevo índice del índice original. Los valores en el nivel 2 del índice están en secuencia y en el nivel 1 del índice se tiene un registro para cada página del nivel 2 que contiene el mayor valor de clave almacenado en esa página y la página correspondiente (índice no denso o sparse). El índice de alto nivel se puede tener en memoria principal, buscar en él, devolver la página exacta del índice de bajo nivel donde se encuentra almacenado ese registro, buscar en memoria principal el registro exacto en esa página de bajo nivel y finalmente devolver la página del archivo de datos que contiene el registro que se quiere acceder aleatoriamente. Solo dos accesos son necesarios para obtener de manera aleatoria un registro lógico. A medida que crezca el archivo de datos se pueden ir expandiendo los niveles de índices tanto como sea necesario. Una ventaja adicional de este tipo de organización es que los registros en el archivo de datos no necesitan estar en secuencia. Esto simplifica en gran manera el hecho de insertar y borrar registros en el archivo de datos, ya que no se tienen que hacer reorganizaciones físicas. Sin embargo, la programación para realizar el manejo de índices puede ser complicada. Afortunadamente la organización indexada es un estándar y el manejo de índices es responsabilidad de las rutinas de acceso del S.O. o del SMBD. 1.1.3.3.2. Organización indexada secuencial En este tipo de organización los registros en el archivo de datos están almacenados según la secuencia de la clave primaria. Siendo así a nivel del archivo índice sólo se necesita una entrada o un registro por cada página del archivo de datos (índice no denso) correspondiente al registro que tenga el mayor o el menor valor de clave primaria en la página del archivo de datos. Un ejemplo de este caso se muestra en la siguiente figura: Archivo de Datos Registro Página Empleado 124 Empleado 256 Página 1 Empleado 311 Empleado 315 Empleado 405 Página 2 Empleado 412 Archivo índice Clave Dirección 311 1 412 2 611 3 Empleado 522 Empleado 567 Página 3 Empleado 611 11 El tener menos registros índices implica tener archivos índices de menor tamaño, tiempos de búsqueda más rápidos y pocos niveles de índices a medida que crece el archivo de datos. Por otro lado, no se puede determinar la existencia de un registro con una clave específica buscando sólo en el archivo índice ya que no es denso y para esto se debe acceder el archivo de datos, lo que implica un acceso a disco adicional en comparación con la organización aleatoria indexada, pero al final, como existen menos páginas de índices que en la organización aleatoria indexada y por esto se requieren menos accesos a disco, la organización secuencial indexada resulta más eficiente. Con una organización indexada secuencial, si se quiere hacer un recorrido secuencial de los registros por su clave primaria no es necesario usar el índice, ya que recorriendo el archivo de datos de forma secuencial se obtienen los registros en el orden deseado. El índice se usa cuando se quiere realizar un acceso aleatorio. Si la organización indexada secuencial consume menos espacio y tiene un mejor rendimiento que la organización indexada aleatoria ¿Por qué se usa esta última?. La organización aleatoria indexada permite ordenar el archivo de datos por los campos que sean necesarios, es decir, se pueden definir muchos índices secundarios por diferentes claves usando esta organización. La organización indexada secuencial sólo permite una única secuencia, porque los registros en el archivo de datos sólo pueden estar almacenados según una sola secuencia (generalmente la de la clave primaria). Así que todos los archivos secundarios tienen una organización aleatoria indexada o alguna otra estructura que permita relacionar el valor de una clave secundaria a los registros que contienen ese valor en el archivo de datos. 1.1.3.3.2.1. Manejador de archivos de organización indexada secuencial datos con una ¿Qué sucede cuando se quiere insertar un nuevo registro en un archivo de datos con una organización indexada secuencial cuando la página a utilizar ya está llena? Un método para manejar inserciones en archivos bajo una organización indexada secuencial es el uso de un área de overflow y una cadena de apuntadores. Si la página en donde se va a insertar el registro está llena, el registro se coloca en una página del área de overflow y se establece una conexión con el área de overflow mediante un apuntador para poder ubicarlo al momento de accederlo. En la siguiente figura se muestra un ejemplo: Archivo índice Clave Dirección 311 1 412 2 611 3 Archivo de Datos Registro Página Empleado 124 Empleado 256 Página 1 Empleado 311 Empleado 315 Empleado 405 Página 2 Empleado 412 Apuntador de Localización Overflow Valor 42 410 Apuntador de Localización Overflow Valor 41 412 Empleado 522 Empleado 567 Página 3 Empleado 611 Area de Overflow Registro Página Empleado 412 Empleado 410 Página 4 12 Como se ve en el ejemplo anterior se tiene un área de overflow separada y dos nuevos campos en cada página de datos han sido añadidos. Uno de los nuevos campos es un apuntador de localización de overflow el cual enlaza la página del archivo de datos al próximo registro lógico en secuencia localizado en el área de overflow. Este consiste de un número de página y un número de registro relativo dentro del área de overflow. El otro nuevo campo representa el valor de la clave primaria que posee el registro apuntado en el área de overflow. Los registros en el área de overflow son almacenados según la secuencia de llegada no según la secuencia de la clave y por esto se requiere la cadena de apuntadores para el área de overflow. Como es de suponerse, el rendimiento se degrada cada vez más cuando se añaden más registros al área de overflow y comienza a crecer la cadena de apuntadores. Debido a esto, los archivos indexados secuenciales tienen que ser reorganizados periódicamente para que todos los registros sean colocados en el archivo de datos en la secuencia lógica correcta y en este momento se reconstruye el archivo índice. El método de acceso secuencial indexado de IBM (ISAM) usa la técnica de área de overflow sobre una base más complicada, la cual toma en cuenta las características físicas del disco. Un segundo método para manejar las inserciones bajo una organización secuencial indexada es el uso de la técnica de división de bloques. Con esta técnica cuando se va a añadir un registro en una página que no tiene más espacio disponible se usa la siguiente página disponible y los registros contenidos en la página llena más el nuevo registro son divididos entre las dos páginas. Por ejemplo, dado el siguiente archivo de datos: Archivo de Datos Registro Página Empleado 124 Empleado 256 Página 1 Archivo índice Empleado 311 Clave Dirección Empleado 315 311 1 Empleado 405 Página 2 412 2 Empleado 412 611 3 Empleado 522 Empleado 567 Página 3 Empleado 611 Se quiere insertar el registro del Empleado 350. Este registro debería ir en la página 2, pero como no hay más espacio disponible en esa página se usa la página 4, que es la próxima disponible, y se divide el contenido de la página 2 entre la página2 y la página 4 quedando de la siguiente manera: Archivo de Datos Registro Página Empleado 124 Empleado 256 Página 1 Empleado 311 Empleado 315 Empleado 350 Página 2 Empleado 522 Empleado 567 Página 3 Empleado 611 Archivo de índice Clave Dirección 311 1 350 2 412 4 611 3 Empleado 405 Empleado 412 Página 4 El archivo índice tiene que cambiar para reflejar la página añadida en la secuencia apropiada y éste puede ser usado para acceder en forma secuencial el contenido del archivo de datos ya que ahora, según esta técnica, los registros lógicos no están en secuencia por número 13 de página. Para poder recorrer el archivo de datos directamente cuando se quiere hacer un barrido secuencial del archivo de datos se puede añadir un campo adicional a cada página de datos que sirva como apuntador a la próxima página según la secuencia lógica a seguir según la clave primaria. El método de acceso de almacenamiento virtual de IBM (VSAM) usa esta técnica para manejar la organización secuencial indexada. 1.1.4. Estructuras de Datos Las estructuras de archivos discutidas anteriormente ambientes de procesamiento de archivos pero se quedan ambientes completos de SMBD los cuales manejan una gran entre ellos. Para esto necesitan estructuras de datos más encuentran: 1.1.4.1. son suficientes para soportar los cortos para soportar totalmente cantidad de archivos y relaciones sofisticadas entre las cuales se Listas Invertidas Anteriormente se dijo que una estructura de archivo que puede ser usada para representar claves secundarias es una organización aleatoria indexada y estos archivos son llamados índices secundarios. Cuando se usa un índice sobre un campo secundario se dice que se tiene una lista invertida o archivo invertido ya que se ha invertido el rol normal de un campo en el registro porque se encuentra el registro basándose en el valor del campo en vez de encontrar el valor del campo después de haber localizado al registro. En el caso en que se definan listas invertidas sobre campos que pueden tener el mismo valor para diferentes registros en el archivo de datos la estructura de la lista consiste de un primer nivel de índice que tiene una entrada por cada valor diferente del campo de índice existente en el archivo de datos. Para cada una de estas entradas se tienen un apuntador al nivel 2 del índice donde comienza la lista de números de registros relativos con ese valor de campo índice. Por ejemplo, para el siguiente archivo de datos se quiere construir una lista invertida por el campo PCCOST, entonces se tiene lo siguiente: Archivo Empleado NUMEMP COSTO 124 4500 256 0 311 2175 315 2175 405 0 412 0 522 567 611 0 4500 1429 # relativo de registro 1 2 3 4 5 6 7 8 9 La estructura de lista invertida sobre el campo COSTO sería: Nivel 1 del índice Campo Localización índice 0 1 1429 5 2175 6 4500 8 Nivel 2 del índice # relativo de registro 2 5 6 7 9 3 4 1 8 14 Si se tienen listas invertidas para todos los campos del archivo se dice que se tiene un archivo invertido completamente. Si sólo algunos campos tienen asociados listas invertidas se dice entonces que se tiene un archivo invertido parcialmente. Las listas invertidas pueden usarse para responder ciertas consultas sin tener que acceder el archivo de datos, como por ejemplo: - ¿Cuántos empleados tienen costos 0? - ¿Cuántos registros tienen costos mayores que 5000? ... Con la utilización de listas invertidas la recuperación de registros es muy eficiente pero entre las desventajas que tienen se cuenta el espacio requerido para almacenar los índices multinivel y el tiempo extra requerido para actualizar las listas invertidas por lo que las listas invertidas son creadas sólo para los campos sobre los cuales se necesita tener un acceso rápido. El SMBD ADABAS utiliza este esquema de indexación. 1.1.4.2. Listas Enlazadas Una lista enlazada consiste de un campo añadido al final de cada registro lógico en el archivo de datos que tiene un valor de localización del próximo registro lógico en la secuencia. Esta es otra estructura usada para representar claves secundarias. Por ejemplo, la lista enlazada asociada al archivo anterior sobre el campo COSTO sería de la siguiente forma: Head Pointer COSTO: 2 Archivo Empleado NUMEMP COSTO 124 4500 256 0 311 2175 315 2175 405 0 412 0 522 567 611 0 4500 1429 Apuntador sobre COSTO 8 5 4 1 6 7 # relativo de registro 1 2 3 4 5 6 9 3 7 8 9 Externo a los registros del archivo EMPLEADO se tiene un campo adicional que sirve como ancla o apuntador al comienzo de la lista que apunta al primer registro de la secuencia según el campo COSTO. En el ejemplo anterior el último registro de la cadena apunta a NILL, pero otro enfoque es que el último registro apunte al primer registro de la cadena. Este refinamiento se llama lista enlazada circular o anillo. Se pueden tener tantas listas enlazadas como sean necesarias y cada una de ellas requiere espacio adicional y tiempo extra para actualizarlas. Una lista enlazada puede ser usada como una alternativa a las listas invertidas para representar claves secundarias a través de una estructura llamada Multilista. Esta es un índice similar al nivel 1 de índices de la estructura de lista invertida. El índice multilista tienen un registro por cada valor diferente de la clave secundaria y está ordenado por estos valores pero en vez de apuntar al nivel 2 de índices, cada registro multilista tiene un apuntador ancla que comienza la cadena de registros que tienen un valor de la clave secundaria particular. Por ejemplo, una multilista sobre el campo COSTO para el archivo EMPLEADO quedaría de la siguiente manera: 15 Archivo Empleado NUMEMP COSTO 124 4500 256 0 311 2175 315 2175 405 0 412 0 522 567 611 0 4500 1429 Apuntador sobre COSTO 8 5 4 6 7 # relativo de registro 1 2 3 4 5 6 - 7 8 9 índice Multilista sobre el campo COSTO Clave # relativo de reg. 0 2 1429 9 2175 3 4500 1 Si se tienen múltiples claves secundarias se pueden usar estructuras multilistas para cada una. Comparando las multilistas con las listas invertidas, los índices multilistas son más fáciles de crear y mantener ya que el nivel 2 de índices de las listas invertidas tiene un número variable de entradas. Por otro lado, los apuntadores de las multilistas deben ser mantenidos mientras que con las listas invertidas no hay apuntadores que mantener, pero el mantenimiento a nivel de multilistas en el archivo de datos no implica una reorganización física a nivel de páginas sino un mantenimiento a nivel de apuntadores, por los que son más fáciles de mantener que las listas invertidas. Una de las principales desventajas de las multilistas con respecto a las listas invertidas es que es más difícil y toma más tiempo responder ciertas consultas que se pueden hacer con las listas invertidas sin tener que acceder el archivo de datos. 1.1.4.3. Árboles B Los árboles B [6] son una de las estructuras de datos más ampliamente usadas en el procesamiento de base de datos hoy en día. Se usan principalmente para el almacenamiento y manipulación de índices. El árbol B es una forma especial de una estructura general de árbol. Un árbol está formado por nodos conectados por arcos. En el tope del árbol existe un único nodo raíz y sus descendientes lo siguen. Un nodo que no sea la raíz junto con todos sus descendientes comprenden un subárbol del árbol original. Cada nodo tiene exactamente un padre excepto el nodo raíz que no tiene padre. Los ancestros de un nodo son todos los nodos, incluyendo la raíz, que conectan al nodo a la raíz. Un nodo hoja no tiene hijos. Un nodo gemelo es un nodo relacionado con otros nodos por el hecho de que tienen el mismo padre. La raíz se define como el nivel 0 del árbol, los hijos de la raíz son el nivel 1 y así sucesivamente. La altura del árbol es el máximo número de niveles en el árbol. Un árbol balanceado es aquel en donde la profundidad de cada subárbol de nodos difiere a lo más en uno. El orden o grado de un árbol es el número máximo de hijos que puede tener un nodo del árbol. Cuando se usa este tipo de estructura de datos para los archivos índices, el objetivo es minimizar los accesos a disco cuando se quiere hacer un acceso aleatorio a un registro específico. Si se usa una estructura de árbol y cada nodo es una página de disco lo que se quiere alcanzar para lograr el objetivo anterior es un árbol balanceado con la menor cantidad de niveles que sean posibles. Una estructura de árbol que satisface bien esta condición es el árbol B. En el ambiente de base de datos un árbol B es un índice multinivel donde cada uno de sus nodos es una página índice y tienen el siguiente formato general: Apun 1 Clave 1 Apun 2 Clave 2 Apun 3..... Cada apuntador apunta a la página índice en el nivel inferior siguiente, cada clave es el valor de la clave de un registro lógico en el archivo de datos. Cada valor de clave (combinación de valor clave y dirección) que exista en el archivo de datos va a aparecer solo una vez en la estructura de árbol. El número máximo de apuntadores en la página es el orden del árbol B, de aquí que el número máximo de apuntadores determine el número máximo de hijos que puede tener el nodo. En cada nodo del árbol B los valores claves que contienen están en secuencia Un árbol B de orden n tiene las siguientes propiedades: 16 • La raíz es una hoja o tiene al menos dos hijos. • Cada nodo, excepto la raíz y las hojas, tienen entre n/2 y n hijos. • Todas las hojas aparecen al mismo nivel. • Un nodo no hoja con k hijos tiene k-1 claves. Por ejemplo, véase el siguiente árbol de orden 5: * 425 * 0 - 0 - 0 - * 140 * 325 * 0 - 0 - * 123 * 125 * 130 * 138 * * 450 * 522 * 0 - 0 - * 532 * 600 * 710 * 0 - * 256 * 311 * 315 * 0 - * 405 * 412 * 0 - 0 - * 567 * 575 * 0 - 0 * 622 * 0 - 0 - 0 * 750 * 800 * 803 * 839 * - - Las ventajas de los árboles B son: Permiten un rápido acceso aleatorio a los registros de datos, el cual implica en el peor de los casos, tantos accesos a disco como niveles tenga el árbol B. Las inserciones y eliminaciones son razonablemente eficientes. La utilización del disco es aceptable ya que por cada nodo se va a tener ocupado mínimo el 50 % de su capacidad. El archivo de datos es mantenido en secuencia por la clave primaria por lo que el acceso secuencial es posible y eficiente. 1.1.4.4. Árboles B+ El árbol B+ [7] es una variación del árbol B. La diferencia esta en que en un árbol B+, los apuntadores de datos se almacenan sólo en los nodos hojas del árbol, por lo cual la estructura de los nodos hoja difiere de la de los nodos internos. Los nodos hoja del árbol B+ suelen estar enlazados para ofrecer un acceso ordenado a los registros según el campo de búsqueda. Los nodos internos del árbol B+ corresponden a los demás niveles del índice. Algunos valores del campo de búsqueda de los nodos hoja se repiten en los nodos internos del árbol B+ con el fin de guiar la búsqueda. La estructura de los nodos internos de un árbol B+ de orden p se define como sigue: 1. Todo nodo interno tiene la forma: <Apun 1, Clave 1, ..., Apun q-1 Clave q -1> donde q <= p, cada Apun i es un apuntador de árbol y cada Clave i es un valor de la clave. 2. Dentro de cada nodo interno, Clave 1 < Clave 2 < ... < Clave q - 1. 3. Para todos los valores X del campo de búsqueda del subárbol al que apunta Apun i, tenemos Clave i – 1 < X <= Clave i, para 1 < i < q, X <= Clave i, para i = 1, y Clave i - 1 < X, para i = q 4. Cada nodo interno tiene cuando más p apuntadores de árbol. 5. Cada nodo interno, con excepción de la raíz, tiene por lo menos (p/2) apuntadores de árbol. El nodo raíz tiene por lo menos dos apuntadores de árbol si es un nodo interno. 17 6. Un nodo interno con q apuntadores, donde q <= p, tiene q – 1 valores de campo de búsqueda. La estructura de los nodos hojas de un árbol B+ de orden p es como sigue: 1. Todo nodo interno tiene la forma: <Clave 1, Apun 1, ..., Clave q -1, Apun q-1, Apun siguiente> donde q <= p, cada Apun i es un apuntador de datos, cada Clave i es un valor de la clave y Apun siguiente apunta al siguiente nodo hoja del árbol B+. 2. Dentro de cada nodo hoja, Clave 1 < Clave 2 < ... < Clave q – 1, donde q <= p. 3. Cada Apun i es un apuntador de datos que apunta al registro cuyo valor de clave de búsqueda es Clave i, o a un bloque de archivo que contiene dicho registro (o a un bloque de apuntadores que apuntan a registros cuyo valor del campo de búsqueda es Clave i, si el campo de búsqueda no es clave). 4. Cada nodo hoja tiene por lo menos (p/2) valores. 5. Todos los nodos hoja están en el mismo nivel. 1.2. Casos de Estudio [12, 13] 1.2.1. Sybase Los índices son objetos de la base de datos que pueden crearse para una tabla para acelerar el acceso directo a las filas de los datos específicas. Los índices guardan los valores de la clave y apuntadores lógicos a las páginas de los datos ó a otras páginas del índice. El Servidor de SQL proporciona dos tipos de índices: - Indices clustered (arracimados) donde los datos de la tabla se guarda físicamente en el orden de las claves en el índice. - Indices Nonclustered donde el índice esta ordenado, pero la tabla no. Las filas en la tabla no tienen ningún orden particular, y se agregan nuevas filas en el extremo de la tabla. Los índices pueden tener múltiples niveles: • El Nivel raíz es el nivel más alto del índice. Si la tabla es muy pequeña, no hay ningún nivel intermedio y la raíz guarda los apuntadores a las páginas de los datos. Para las tablas más grandes, la página de la raíz guarda los apuntadores al nivel intermedio de las páginas del índice. • El Nivel hoja es el nivel más bajo del índice. A nivel de la hoja, el índice contiene un valor importante por cada fila en la tabla, y las filas se guardan según el orden de la clave del índice. Para los índices del nonclustered, el nivel de la hoja contiene el índice a los valores importantes, es decir, un indicador a la página dónde las filas se guardan, y un apuntador a las filas en la página donde están los datos. El nivel de la hoja simplemente es el nivel anterior los datos. • El Nivel del intermedio: Todos niveles entre la raíz y las hojas son los niveles intermedios. Un índice sobre una tabla grande o un índice que usa las claves largas puede tener muchos niveles intermedios. Una tabla muy pequeña no puede tener un nivel intermedio; la raíz apunta directamente al nivel de la hoja. Cada nivel (excepto el nivel de la raíz) contiene: las claves de la página y los apuntadores de la página anteriores luego a otras páginas al mismo nivel del índice. 1.2.2. Oracle Oracle se conoce como un sistema de gestión de base de datos relacional, que además admite estructuras O.O. (Orientadas a Objetos), como métodos y tipos de datos abstractos. Tanto si se utiliza estructuras relacionales como estructuras OO la base de datos Oracle almacena los datos en archivos. Internamente, existen estructuras en la base de datos que realizan una asignación lógica entre los datos y los archivos, lo que permite almacenar por separado diferentes tipos de datos. Estas divisiones lógicas se denominan espacios de tablas. Cada espacio de tablas consta de uno más archivos, llamados archivos de datos, que se almacenan en un disco. Un archivo de datos solo puede pertenecer a un único espacio de tablas. 18 Una instancia de base de datos (también conocida como servidor) es un conjunto de estructuras de memoria y procesos de segundo plano que acceden a un conjunto de archivos de la base de datos. Las estructuras de datos de la base de datos de Oracle pueden dividirse en 3 categorías: 1. Interna de la Base de Datos. 2. Interna a la Área de Memoria. 3. Los externos a la Base de Datos. Entre los internos a la base de datos podemos nombrar: tablas, columnas, restricciones, tipos de datos, índices, agrupaciones, agrupaciones hash, procedimientos, funciones, vistas, etc. Un índice es una estructura de base de datos que utiliza el servidor para localizar rápidamente una fila de una tabla. Existen 3 tipos de índices: • Índice de agrupación. • Índice de tabla. • Índice de mapa de bits. Los elementos de los índices de tabla y de agrupación de una base de datos Oracle se almacena mediante un mecanismo de árbol binario. Las operaciones de E/S necesarias para localizar un valor clave son mínimas y, una vez encontrado, se utiliza el identificador de fila para acceder directamente a una fila. Las agrupaciones hash utilizan funciones hash sobre la clave de agrupación de fila para determinar la ubicación física en la que debe almacenarse una fila. Los internos a la área de memoria constan de los siguientes elementos: • Área Global del Sistema (SGA). • Caché del buffer del bloque de datos. • Cache del diccionario. • Buffer del registro de rehacer. • Área de SQL compartida. • Área de contexto. • Área global del sistema (PGA). Los externos a la Base de Datos constan de los siguientes elementos: • Los registros de rehacer. • Los archivos de control. • Los archivos de traza. • Los archivos de alertas. En Oracle versión 8 el manejo de memoria se hace por Árboles Balanceados, las tablas organizadas mediante índices almacenan las columnas de una tabla en los nodos de hoja de la estructura de índice B-tree de Oracle8. De esta manera se reducen los requisitos globales de almacenamiento cuando la mayoría de las columnas se indexan almacenándolas una sola vez, no en un índice y en una tabla aparte. Las tablas organizadas mediante índices también reducen el tiempo de acceso al recuperar todas las columnas desde una ubicación, en lugar de hacerlo desde dos. El rendimiento de PL/SQL aumenta, al igual que el rendimiento al realizar llamadas a SQL desde PL/SQL, y viceversa. Para facilitar la administración, mejorar la disponibilidad de los datos críticos y aumentar el rendimiento de consultas y DML, Oracle8 permite dividir las tablas y los índices en particiones, o partes más pequeñas, en función de un rango de claves. La división en particiones es una estrategia del tipo “divide y vencerás” que mejora la administración y el rendimiento en sistemas de data warehouse y de procesamiento de transacciones on line. Puesto que las particiones funcionan independientemente las unas de las otras, los datos contenidos en una tabla dividida de esta manera están disponibles aunque una o más particiones no estén disponibles. Las particiones también facilitan la gestión de tablas grandes al desglosar las tareas administrativas en otras más pequeñas, que a su vez pueden realizarse en paralelo. Por último, la división de una tabla o un índice en particiones puede mejorar el rendimiento de las operaciones realizadas con los datos, al eliminar las particiones no utilizadas del plan de ejecución de la operación. 19 20 7. REFERENCIAS BIBLIOGRAFICAS [1] Date C.J. “An Introduction to Database Systems”. 7th edition, Addison-Wesley, 2000. [2] Gio Wiederhold. “Database Design”. 2a edición. Nueva York, N.Y.; McGraw-Hill (1983). [3] T.H. Merret. “Relational Information Systems”. Reston, Va: Reston Publishing Company Inc. (1984). [4] Michael Stonebraker. “Operating System Support for Database Management”. CACM 24, núm 7. Julio 1981. [5] Pratt P. and Adamski J. “Database Systems Management and Design”. Third Edition. Boyd & Fraser publishing company. 1994. [6] R. Bayer y C. McCreight. “Organization and maintenance of Large Ordered Indexes”. Acta Informática 1, núm 3 (1972). [7] Elmasri / Navathe. “Sistemas de Bases de Datos. Conceptos fundamentales”. Addison Wesley. Segunda Edición 1997. [8] Öszu, Tamar and Valduriez, P. “Principles of Distributed Database Systems”. 2nd Ed. Prentice Hall, 1998. [9] Korth H., Silberschatz A, Sudarshan, S. “Fundamentos de bases de datos”. Tercera edición. McGraw-Hill. 1998. ISBN 84-481-2021-3 [10] Leon-Hong B., Plagman B., “Data Dictionary Directory Systems”. J. Wiley, 1982. [11] Fernandez E., Summers R., Wood C. “Database Security and Integrity”. Addison Wesley, 1981. [12] Loney, Kevin. “ORACLE 8. Manual del administrador”. McGrawHill. Primera Edición 2000. FUENTES ELECTRÓNICAS [13] Sybase. “Fast Track to Adaptive Server Enterprise 11.9.2”. 2001. URL: www.sybase.com. 21