BLOQUE 5: ORGANIZACIÓN DE UNA SISTEMA GESTOR DE BASES DE DATOS RELACIONALES 5.1.- INTRODUCCIÓN Normalmente los usuarios de Sistemas Informáticos están rodeados de grandes volúmenes de datos, que no resultan muy útiles cuando no están bien documentados y no tienen asociada una semántica precisa que indique el significado y utilidad de cada uno de ellos. De aquí surge la necesidad de disponer de un diccionario de recursos de información (DRI) que contenga las descripciones de todos los datos que constituyen el sistema informático y ayuden a la gestión de la información. Esto se consigue almacenando, administrando y controlando lo que se denominan metadatos, es decir los datos que definen y describen los datos que maneja el sistema. En principio se crearon dos almacenes distintos para contener esta información: Diccionario de datos: que contenía la información sobre los datos almacenados en la base de datos, sus definiciones, significado, estructura, etc., que era mantenido por el propio usuario. Directorio de datos: contenía donde y como estaban almacenados los datos en la base de datos y era mantenido por el Sistema Gestor de Base de Datos. En las bases de datos relacionales aparece el concepto de catálogo del Sistema Gestor de Base de Datos, que une ambas cosas, el diccionario de datos y el directorio de datos y además lo gestiona el propio SGBD y es una base de datos más dentro de la propia base de datos, por esta razón también recibe el nombre de metabase. El catálogo del sistema gestor de una base de datos relacional supone grandes ventajas para el usuario y sobre todo para el administrador de la base de datos ya que esta mantenido de forma automática por el SGBD y además se puede acceder a él como a cualquier otra base de datos mediante el lenguaje SQL. Según palabras de Codd (1990), el requisito para que un SGBD pueda considerarse relacional es que “soporte un catálogo dinámico en línea en el que la descripción de la base de datos se represente como cualquier otro dato, permitiendo a los usuarios autorizados aplicar el mismo lenguaje relacional tanto a la descripción como a los datos regulares”. Pág. 1 5.2.- CATÁLAGO DE LA BASE DE DATOS El catálogo de una base de datos está formado por un conjunto de tablas donde se recoge toda la información sobre las tablas, columnas, índices, permisos, etc., que tiene una determinada base de datos. El mantenimiento de las tablas del catálogo lo realiza automáticamente el Sistema Gestor de la Base de Datos, las tablas se almacenan en el directorio de la base de datos . Ejemplos de este catálogo pueden ser: . systables: tablas que componen la base de datos. . syscolumns: columnas que forman cada una de las tablas de la base de datos. . sysindexes: índices de cada tabla . systabauth: permisos de acceso a las tablas. . syscolauth: permisos de acceso a las columnas. . sysusers: permisos de acceso a la base de datos. . sysviews: composición de views. . sysdepend: estructura de las views. . syssynonyms: sinónimos de las tablas. . sysforeing: claves referenciales de cada tabla. . syscolattr: atributos CTSQL de cada columna. . syscollating: secuencia de ordenación. Pág. 2 5.3.- ESTRUCTURA DEL SISTEMA GESTOR DE BASES DE DATOS Un sistema de base de datos está formado por diferentes módulos y cada uno se encarga de realizar funciones concretas, aunque generalmente algunas de esas funciones las puede realizar el sistema operativo. Administrador Programadores Usuarios USUARIOS PROCESADOR DE CONSULTAS Sistema Gestor de la Base de Datos GESTOR DE ALMACENAMIENTO Indices Datos estadísticos Almacenamiento en disco Diccionario de datos Archivos de datos Las funciones que desarrolla el sistema gestor de la base de datos (aunque no siempre) se pueden incluir en dos módulos: Procesador de consultas: para ello dispone de los siguientes módulos: a) Compilador del lenguaje de manejo de datos (DML): que traduce las instrucciones SQL a instrucciones de bajo nivel y transforma las solicitudes del usuario en otras mas eficientes, las optimiza. b) Precompilador de lenguaje de manejo de datos (DML): que convierte las instrucciones SQL embebidas en otro lenguaje de programación en instrucciones que entiende el procesador de consultas. Pág. 3 c) Interprete del lenguaje de definición de datos(DDL): que interpreta las instrucciones DDL y realiza las anotaciones correspondientes en el catálogo de la base de datos. d) Motor de evaluación de consultas: ejecuta las instrucciones de bajo nivel generadas por el compilador del DML. Gestión del almacenamiento: es el interfaz entre los datos almacenados en el disco y las instruciones de bajo nivel obtenidas por el procesador de consultas, está compuesto por los siguientes módulos: a) Gestor de autorización e integridad: comprueba que se satisfagan las reglas de integridad impuestas y las debidas autorizaciones de los usuarios para acceder a los datos. b) Gestor de transacciones: se asegura de que la base de datos tenga un estado consistente aunque existan fallos del sistema y de que la ejecución de transacciones consistentes ocurran sin conflictos. c) Gestor de archivos: gestiona la reserva de espacio de almacenamiento en disco y las estructuras de datos usadas para representar la información. d) Gestor de memoria interna: es el responsable de traer los datos del disco a memoria principal. Pág. 4 5.4.- ACCESO AL ALMACENAMIENTO Las bases de datos contienen varios archivos diferentes que son mantenidos por el sistema operativo subyacente, cada archivo se divide en unidades de almacenamiento de longitud constante llamadas bloques que son las unidades de asignación de almacenamiento y de transferencia de datos. Cada bloque puede contener varios elementos de datos dependiendo de la organización física de los datos que se utilice. Uno de los principales objetivos de las bases de datos es minimizar el número de accesos al disco para ello mantiene en memoria principal todos los bloques posibles, de forma que cuando se necesite un determinado dato, el bloque que lo contienen ya esté en memoria y no sea necesario realizar un acceso a disco. El espacio donde se almacenan los bloques es la memoria intermedia (buffer) y el subsistema responsable de la asignación del espacio de memoria intermedia se denomina gestor de la memoria intermedia. El sistema de trabajo es el siguiente: los programas de bases de datos realizan solicitudes al gestor de memoria intermedia cuando necesitan un bloque, si ese bloque está en memoria intermedia el gestor pasa al solicitante su dirección en memoria principal. Si el bloque no está en memoria intermedia, el gestor primero asigna espacio en memoria intermedia para el bloque, si hiciera falta espacio, descarta alguno de los bloques, escribiendolo en el disco si ha habido alguna modificación y despues accede al disco para leer y bloque solicitado y lo escribe en memoria intermedia pasando la dirección correspondiente al solicitante. Los sistemas que se utilizan para la sustitución de bloques en memoria intermedia pueden ser diferentes. En los programas que no utilizan una base de datos es imposible predecir con precisión cuales serán los bloques a los que se va a hacer referencia por tanto los sistemas operativos normalmente utilizan el sistema LRU (Least Recently Used, menos utilizado recientemente) para sustuir los bloques en memoria intermedia. En las aplicaciones que utilizan bases de datos, se dispone de información para conocer al menos a corto plazo cual será la información necesaria (optimizador), además existen bloques como los correspondientes al catálogo de la base de datos, que se utilizan constantemente, o los índices de los archivos que se utilizan con más frecuencia que los propios archivos de la base de datos, por tanto debe evitar quitarlos de la memoria intermedia. Hay otra serie de factores que debe tener en cuenta como conservar la consistencia de la base de datos si existe concurrencia de varios usuarios etc. Por todo lo expuesto un sistema de base de datos debe utilizar sistemas diferentes al LRU para realizar la sustitución de bloques en la memoria intermedia y no siempre es suficiente la gestión realizada por el sistema operativo. Pág. 5 5.5.- ORGANIZACIÓN DE LOS ARCHIVOS. AGRUPACIONES (CLUSTERS) En los sistemas de bases de datos se organiza la información en diferentes archivos formado cada uno de ellos por registros que contienen información sobre la misma entidad de negocio, por tanto es equivalente a cualquier otro sistema de ficheros. Todo sistema operativo dispone de un sistema de gestión de archivos que será donde se apoye la base de datos para gestionar sus tablas. La información sobre el contenido de cada archivo se encuentra en la cabecera de archivo (FAT) y la información sobre los archivos que contiene el disco en el directorio del disco y normalmente es el sistema de gestión de archivos del sistema operativo quien mantiene el almacenamiento físico de los datos, esta forma de implementar las bases de datos relacionales deja de ser eficiente a medida que aumenta el tamaño de la base de datos. Sistemas de bases de datos de gran tamaño no utilizan directamente el sistema operativo para la gestión de archivos, sino que se asigna a la base de datos un archivo de gran tamaño del sistema operativo donde se guardan todas las relaciones y la gestión de este archivo corresponde al sistema gestor de base de datos. Supongamos la siguiente consulta: SELECT num_cuenta, nombre,calle,ciudad FROM impositor,cliente WHERE impositor.nombre=cliente.nombre si tenemos dos archivos diferentes: impositor Nombre López López López Abril Num_cuenta C-102 C-220 C-503 C-305 cliente Nombre López Abril Calle Principal Del Pez Ciudad Almazán Burgo En el peor de los casos si cada registro se encuentra en un bloque diferente tendremos que realizar tantos accesos a disco como registros necesitamos. Si realizamos el almacenamiento de la siguiente manera: López López López López Abril Abril Principal C-102 C-220 C-503 Del Pez C-305 Almazán Burgo Pág. 6 Esta estructura mezcla las tuplas de dos relaciones pero permite un procesamiento mas eficaz ya que cuando se lee una tupla correspondiente a la relación cliente pasa todo el bloque a memoria intermedia y por tanto pasan también las tuplas de la relación impositor que se relacionan con dicho cliente, si un cliente tiene tantas cuentas que no caben en el mismo bloque, estarán en otro bloque y como mucho se realizarán dos lecturas para procesar los datos correspondientes a dicho cliente. Para poder realizar consultas sobre la misma relación, se añade un sistema de punteros que recorre los registros que pertenecen a la misma relación. Esta forma de almacenar la información se denomina en agrupaciones o clusters y la agrupación que se debe realizar depende de los tipos de consulta que se vayan a obtener en la aplicación y su frecuencia por tanto se determinan en la fase de diseño de la base de datos cuando se ha estudiado la carga que va tener. Un buen SGBD debe permitir al administrador que especifique agrupamientos diferentes para distintos archivos o modificar un determinado agrupamiento si cambian las requerimientos de la aplicación, pero en ningún momento un cambio en el agrupamiento debe suponer modificaciones en las aplicaciones que utilizan dichos datos ya que debe existir total independencia entre los datos y los programas. Pág. 7 5.6.- EL OPTIMIZADOR DE SQL El optimizador de ‘queries’ decide la estrategia de búsqueda sobre las tablas que intervienen en las sentencias teniendo en cuenta los siguientes factores: Índices existentes. Uso del ROWID Número de filas en la tabla Enlaces Orden de las condiciones en la cláusula WHERE. Orden de las tablas en la cláusula FROM de la instrucción SELECT. Para tomar una decisión realiza los siguientes pasos: Paso 1.- analiza las condiciones incluidas en la cláusula WHERE y las agrupa por tabla, evaluando los rangos de valores en cada tabla. Paso 2.- teniendo en cuenta los rangos encontrados en cada tabla selecciona la mejor estrategia de búsqueda: por índice, por ROWID o secuencial. Para ello comprueba si las columnas implicadas forman parte de algún índice, si incluye condiciones por ROWID o en el peor de los casos si debe realizar un acceso secuencial a toda la tabla. Paso 3.- selección de la secuencia de acceso a las diferentes tablas que intervienen, decidiendo cual será la primera tabla a la que tiene que acceder que en principio será la que devuelva un menor número de filas con el menor número de lecturas en el disco. Esto decisión la toma teniendo en cuenta los datos obtenidos en el paso 2. Una vez seleccionada la primera tabla vuelve al paso 2 para ver los enlaces de la tabla relacionada con el resto. Este proceso continúa hasta terminar con todas las tablas que intervienen en la sentencia. El optimizador solamente decide en el caso de que una estrategia sea mejor que el resto, sino no hay ningún motivo para decantarse por una forma de acceder u otra elige la primera estrategia encontrada. La persona que realiza los programas puede forzar al SQL a utilizar una estrategia determinada en función de cómo escriba sus sentencias. Para tomar la decisión de qué índice es el más adecuado intervienen los siguientes elementos: 1.- Número de partes del índice referenciadas en la WHERE mediante condiciones =, >=, >, LIKE, IN, BETWEEN. 2.- Si un índice es compuesto solamente se tendrá en cuenta la referencia a una de sus partes si se referencian todas las componentes del índice anteriores a esa parte en otras condiciones de la WHERE. 3.- Un índice referenciado en todas sus partes por las condiciones indicadas es mejor que un índice del que no se referencian todas sus componentes. Pág. 8 4.- Un índice referenciado en todas sus partes por condiciones de igualdad es mejor que otro referenciado en todas sus partes por cualquier otra condición. 5.- Un índice referenciado en todas sus partes por condiciones de igualdad es mejor que otro en su mismo caso si el primero es único y el segundo no. 6.- Si hasta aquí llegamos en condiciones de igualdad de los dos índices, el optimizador seleccionará en primer lugar el primero al que se hace referencia en la cláusula WHERE y si esta columna pertenece a los dos índices se elige el que sea clave primaria (si lo es), sino el que se haya creado antes. 7.- Una condición es optimizable si es única o está unida a otras condiciones por la cláusula AND. SELECT * FROM clientes WHERE num_cliente>20 OR num_provincia>10 no es optimizable y se hará un acceso secuencial a la tabla. SELECT * FROM clientes WHERE num_cliente>20 AND num_provincia>10 Si es optimizable y se accederá por num_cliente si hay un índice para dicha columna o bien hay un índice compuesto en el que la primera columna es num_cliente, si hubiera índices para num_cliente y num_provincia, se accederá por num_cliente por ser el que se ha referenciado primero. Por tanto el programador puede forzar los accesos por num_provincia si escribe la sentencia de la siguiente manera: SELECT * FROM clientes WHERE num_provincia>10 AND num_cliente>20. 8.- Una condición optimizable por ROWID es siempre mejor que un acceso por índice, en el caso: SELECT * FROM clientes WHERE num_cliente>15 AND rowid in (13,23,1,45), accederá directamente a las filas indicadas por el ROWID. 9.- Una claúsula ORDER BY supone realizar una ordenación del resultado de una SELECT salvo si la ordenación se puede optimizar, esto ocurre cuando se dan todas las condiciones siguientes: La SELECT se realiza sobre una sola tabla. No se ha podido determinar ningún índice de acceso a la tabla o bien el índice de acceso coincide con el de ordenación. Para determinar la secuencia de accesos a las tablas se tienen en cuenta las siguientes condiciones: siempre es mejor acceder primero a la tabla cuyas filas válidas sea menor, ya que en principio el número de accesos a disco es menor. Para conocer el número de filas devuelve cada tabla utiliza siempre las condiciones más restrictivas, siempre es mejor una tabla a la que se puede acceder mediante un índice o por ROWID que otra que no pueda serlo. Si existen dos tablas a las que no se puede acceder por índice se elige la que tenga menos filas. El número de filas se obtiene de la columna nrow de la tabla systables, por lo que es conveniente tener actualizada esta columna. Si a dos tablas no se va a acceder por índices y tienen el mismo número de filas se elige el orden de acceso definido en la cláusula FROM. Pág. 9