Clase 2: Estructuras lógicas y físicas(I) Claudia González ___________________________________________________________________________________ Clase 2: Estructuras Lógicas y Físicas(I) • Introducción a Segmentos, Extents y bloques de datos • Bloque de datos • Inittrans, Maxtrans • Extents • Segmentos • Cláusula Storage • Introducción tablespaces, datafiles • Tablespaces • Datafiles • Tablas • Regulares • Organizadas por índices • Particionadas • Clúster Se puede hacer un repaso de la relación entre las estructuras lógicas y físicas.... Relación estructuras lógicas y físicas Clase 2: Estructuras lógicas y físicas(I) Claudia González ___________________________________________________________________________________ Estructuras Físicas: bloque de datos del sistema operativo, datafile, redo log file, control file. Estructuras Lógicas: bloque de datos de Oracle, extent, segmento, tablespace, base de datos. Bloques de Datos, Extents y Segmentos Introducción Las unidades de asignación de espacio en la base de datos son los bloques de datos, extents y segmentos. El nivel más fino de granularidad en que Oracle almacena los datos es el bloque de datos (también llamados bloques lógicos, bloques de Oracle o páginas). Un bloque de datos corresponde a un número de bytes físicos de espacio de la base de datos en disco. Un segmento es un conjunto de extents, cada uno de los cuales ha sido asignado a una estructura de datos específicas, pertenecientes a un tablespace. Por ejemplo, cada tabla de datos es almacenada en su propio segmento de datos, mientras que cada índice de datos es almacenado en su propio segmento de índices. Si la tabla o índice es particionado, cada partición es almacenada en su propio segmento. Bloques de Datos Oracle maneja el espacio de almacenamiento en datafiles de una base de datos en unidades llamadas bloques de datos. Un bloque de datos es la unidad más pequeña de datos usada por una base de datos. Oracle solicita los datos en múltiplos de los bloques de datos de Oracle y no del sistema operativo. El tamaño estándar del bloque se puede conocer consultando el parámetro DB_BLOCK_SIZE. Los tamaños de los bloques de datos deben ser un múltiplo de los tamaños de bloques del sistema operativo, entonado para evitar I/Os innecesarios. Formato del Bloque de datos Encabezado El encabezado contiene información general del bloque, como la dirección del bloque y el tipo de segmento (datos, índices). Clase 2: Estructuras lógicas y físicas(I) Claudia González ___________________________________________________________________________________ Directorio de tablas Contiene información acerca de las tablas que contienen tuplas en el bloque. Directorio de Registros Contiene información de las tuplas actuales en el bloque (incluyendo direcciones para cada row piece “trozo de registro” en el área de datos). Después que el espacio ha sido asignado en el directorio de registros de un bloque de datos, éste no es reclamado cuando el registro es borrado. Oracle reutiliza el espacio sólo cuando se insertan nuevos registros en el bloque. Overhead El encabezado del bloque de datos, directorio de tablas y directorio de registros son denominados de forma colectiva como overhead. Datos de los registros Contiene la tabla o datos de índices. Los registros puede atravesar bloques. Espacio libre El espacio libre es asignado para la inserción de nuevos registros y para la actualización de registros que requieran espacio adicional. En los bloques de datos asignados para segmentos de datos de una tabla o clúster o para los segmentos de un índice, el espacio libre puede almacenar registros de transacciones. Un registro de una transacción es requerido un un bloque para cada instrucción de INSERT, UPDATE, DELETE y SELECT FOR UDATE que accede una o más registros en el bloque. En la mayoría de los SOs un registro de una transacción requiere 23 bytes. Manejo del Espacio Libre El espacio libre en un segmento se maneja mediante el uso de bitmaps en lugar de listas. El espacio liberado por una transacción de DELETE y UPDATE puede utilizarse para nuevas instrucciones de INSERT si: • Las instrucción de INSERT es de la misma transacción y aparece luego de la instrucción que libera espacio, esta instrucción puede usar el espacio libre inmediatamente. • La instrucción de INSERT esta en otra transacción, no pertenece a aquella que liberó el espacio, por lo que debe esperar Clase 2: Estructuras lógicas y físicas(I) Claudia González ___________________________________________________________________________________ por una instrucción de commit de aquella que libera el espacio para poder utilizarlo. El espacio liberado puede o no ser contiguo con el área de espacio libre en el bloque. Oracle fusiona los espacios libres sólo cuando: una instrucción de INSERT o UPDATE intenta usar un bloque que contiene suficiente espacio libre para contener un nuevo trozo de un registro y el espacio libre esta fragmentado. Parámetros de los bloques PCTFREE: el parámetro PCTFREE especifica el mínimo porcentaje de un bloque de datos para ser reservado como espacio libre para posibles actualizaciones de registros que han sido insertados en el bloque. PCTUSED: el parámetro PCTUSED especifica el porcentaje mínimo de un bloque que puede ser usado para un registro más el overhead antes de que nuevos registros sean añadidos al bloque. Después que un bloque se llena al límite determinado por el PCTFREE, Oracle considera el bloque no disponible para la inserción de nuevos registros hasta que el porcentaje del bloque cae por debajo del parámetro PCTUSED. Hasta que este no se alcance, Oracle utiliza el espacio libre del bloque de datos sólo para actualizaciones de registros que se encuentren en el bloque. Clase 2: Estructuras lógicas y físicas(I) Claudia González ___________________________________________________________________________________ Explicar bien el gráfico anterior... INITTRANS y MAXTRANS permiten especificar el número inicial y máximo de “slots” para transacciones concurrentes que se crearán en el bloque que almacene índices o datos. Los “slots” de transacciones se utilizan para almacenar la información de las transacciones que están haciendo cambios sobre el bloque de datos en un instante dado. Una transacción puede utilizar un “slot” si está cambiando mas de una fila o entrada de un índice. INITTRANS, cuyo valor por defecto es 1 para los segmentos de datos y 2 para los segmentos de índices, garantiza un mínimo nivel de concurrencia. Por ejemplo, si INITTRANS se define como 3 para cierto objeto lógico (y por lo tanto para los bloques de datos de los extents incluidos en los segmentos asociados al objeto), se asegura que al menos tres transacciones concurrentes podrán hacer cambios en el bloque. Si se requiere más espacio (más transacciones concurrentes requieren de alguno de los bloques de datos en el segmento) el espacio se tomará del espacio libre del bloque. MAXTRANS, cuyo valor por defecto es de 255, delimita el número de transacciones que pueden hacer cambios a los datos en un bloque de datos o índices. Una vez definido, este parámetro garantiza que habrá suficiente espacio en el bloque para albergar la información del número de Clase 2: Estructuras lógicas y físicas(I) Claudia González ___________________________________________________________________________________ transacciones indicadas. Extents Un extent es una unidad lógica de asignación de espacio de almacenamiento en una base de datos hecha de un número continuo de bloques de datos. Uno o más extents hacen un segmento. Cuando el espacio existente en el segmento está completamente usado, Oracle asigna un nuevo extent para el segmento. Cuando se crea una tabla, Oracle asigna el segmento de datos de la tabla con un extent inicial que se corresponde con un número de bloques de datos. Si los bloques de datos del extent inicial del segmento llegan a estar llenos y se requiere más espacio, Oracle asigna un extent incremental para el segmento. Un extent incremental es un extent subsiguiente del mismo tamaño que el anterior o más grande. Por propósitos de mantenimiento, el encabezado del bloque de cada segmento contiene un directorio de los extents en el segmento. Determinar el número y tamaño de los extents Los parámetros de almacenamiento expresados en términos de extents definen los segmentos. Se pueden especificar estos parámetros en cada tabla y de no hacerlo se utilizan los del tablespace. Antes de Oracle8i, los tablespaces eran creados como dictionary managed. Los tablespaces manejados por el diccionario delegan el registro de la utilización del espacio a tablas del diccionario de datos. Desde Oracle8i se pueden crear tablespaces locally managed, que utilizan bitmaps (en lugar de tablas del diccionario de datos) para registrar el espacio libre e utilizado. Debido al mejor desempeño y facilidad de mantenimiento de los tablespaces locally managed se toma como defecto que todos los tablespaces excepto SYSTEM serán locally managed. ¿Cómo son asignados los Extents? Inicialmente se determina un datafile candidato en el tablespace y luego se busca en el bitmap del datafile el número de bloques libres requeridos. Si el datafile no tiene suficiente espacio libre adyacente, entonces Oracle busca en otro datafile. Clase 2: Estructuras lógicas y físicas(I) Claudia González ___________________________________________________________________________________ En los tablespaces manejados por el diccionario de datos, cuando un segmento requiere un extent más grande de los extents disponibles, Oracle identifica y combina los extents continuos para formar uno más grande. Ésto se denomina fusión de extents. Este proceso no es necesario en los tablespaces manejados localmente, porque los bitmaps registran automáticamente el espacio libre. ¿Cuándo son liberados los extents? En general, los extents de un segmento no son liberados por un tablespaces hasta que se borra el objeto que almacena los datos en el segmento. Cuando Oracle completa la ejecución de una instrucción que requería un segmento temporal, automáticamente borra el segmento temporal y regresa los extents asignados para el segmento al tablespace asociado (como extents libres). Muchas operaciones de ordenamiento pueden usar segmentos de ordenamiento en un tablespace temporal. Estos segmentos de ordenamiento son asignados sólo una vez para la instancia y no son liberados después del ordenamiento, pero permanecen disponibles para muchas otras operaciones de ordenamiento. Sólo ocurre cuando se posee un tablespace temporal. Segmentos Un segmento es conjunto de extents que contiene todos los datos de una estructura de almacenamiento lógica (como puede ser una tabla) en un tablespace. Por ejemplo para cada tabla, Oracle asigna uno o más extents para forma un segmento de datos de la tabla. Oracle utiliza 4 tipos de segmentos: • Segmentos de Datos • Segmentos de Índices Clase 2: Estructuras lógicas y físicas(I) Claudia González ___________________________________________________________________________________ • • Segmentos Temporales Segmentos de Ordenamiento Segmentos de Datos Son utilizados para almacenar los datos de: • Una tabla que no es particionada o clúster • Una partición de una tabla particionada • Un clúster de tablas Segmentos de Índices Cada índice no particionado tiene un segmento para almacenar sus datos. En el caso de los índices particionados cada partición tiene un segmento asignado Segmentos Temporales Las siguientes operaciones requieren del uso de segmentos temporales: • CREATE INDEX • SELECT ... ORDER BY • SELECT DISTINCT ... • SELECT ... GROUP BY • SELECT ... UNION • SELECT ... INTERSECT • SELECT ... MINUS Los segmentos temporales se pueden almacenar en cualquier tablespace disponible para el usuario, uno de esos puede ser el tablespace temporal, se usa por defecto cuando el usuario tiene asignado algún tablespace temporal. Si no hay ningún tablespace temporal definido para el usuario se utiliza SYSTEM. Oracle borra los segmentos temporales cuando la instrucción se completa. Las tablas temporales se almacenan en segmentos temporales. Las tablas temporales pueden tener el alcance de una transacción o de una sesión. Dependiendo de su alcance son borradas cuando la transacción o la sesión termine. Clase 2: Estructuras lógicas y físicas(I) Claudia González ___________________________________________________________________________________ Segmentos de Ordenamiento Los segmentos de ordenamiento son usados cuando un segmentos es compartido por muchas operaciones de ordenamiento. Un segmento de ordenamiento existe para cada instancia que lleva a cabo una operación de ordenamiento en un tablespace dado. Los segmentos de ordenamiento crecen, mediante la petición de extents, hasta que el tamaño del segmento es mayor o igual a la demanda total de almacenamiento de todas las operaciones de ordenamiento activas en una instancia, no son liberados. Cláusula Storage INITIAL Tamaño, en bytes, del primer extent asignado cuando un segmento es creado. Este parámetro no puede especificarme mediante una instrucción ALTER. NEXT Tamaño, en bytes, del próximo extent incremental a ser asignado a un segmento. El segundo extent es igual al tamaño asignado en NEXT. Los siguientes extents tendrán el tamaño del NEXT previo multiplicado por (1 + PCTINCREASE/100). NEXTi=(1+ PCTINCREASE/100) NEXTi­1. Hacer ejemplo... PCTINCREASE Porcentaje que representa el incremento del tamaño del nuevo extent con respecto al anterior extent asignado a un segmento. Si el PCTINCREASE es 0, entonces todos los extents son del mismo tamaño. Si el PCTINCREASE es mayor que 0, entonces cada NEXT extent debe ser calculado, y crecerá en el porcentaje especificado en el PCTINCREASE. PCTINCREASE no puede ser negativo. MINEXTENTS El número total de extents para ser asignados cuando el segmento es creado. Esto permite una gran asignación de espacio en el momento de creación, aún si el espacio contiguo no esta disponible. MAXEXTENTS El número total de extents, incluyendo el primero, que pueden ser asignados para un segmento. Clase 2: Estructuras lógicas y físicas(I) Claudia González ___________________________________________________________________________________ Tablespaces, Datafiles Una base de datos Oracle consiste de una o más unidades de almacenamiento lógico llamados tablespaces, que almacenan colectivamente todos los datos de la base de datos. Cada tablespace en una base de datos Oracle consiste de uno o más archivos llamados datafiles, que son estructuras físicas del sistema operativo. Los datos de una base de datos son almacenados colectivamente en datafiles que constituyen cada tablespace de la base de datos. Oracle internamente utiliza interfaces estándar de file system para crear y borrar archivos según lo necesite para las siguientes estructuras de la base de datos: • Tablespaces • Online redo lo files • Control files Tablespaces Tablespace SYSTEM Oracle crea el tablespace SYSTEM automáticamente cuando la base de datos es creada. El tablespace SYSTEM esta siempre online cuando la base de datos esta abierta. En una base de datos donde el tablespace SYSTEM es locally managed, no pueden crearse tablespaces que manejen los extents mediante el uso del diccionario. El tablespace SYSTEM siempre contiene las tablas del diccionario de datos de la base de datos completa. Las tablas del diccionario de datos están en el datafile 1. Todos los datos almacenados por causa de programas stored PL/SQL (procedimientos, funciones, paquetes y triggers) residen en el tablespace SYSTEM. Undo tablespaces Son utilizados para información de undo. Cada transacción, a penas se ejecuta la primera operación DML, es asignada a un segmento de undo en el tablespace de undo actual. Si la instancia no tiene un tablespace de undo, la transacción se asigna al segmento de undo del tablespace SYSTEM. Cada tablespace está compuesto de un conjunto de datafiles de undo que son locally managed. Como otros tipos de tablespaces, los bloques de undo son agrupados en extents y el status de cada Clase 2: Estructuras lógicas y físicas(I) Claudia González ___________________________________________________________________________________ extent es representado en un bitmap. Tablespace Temporal Cuando SYSTEM es locally managed sus segmentos no se pueden utilizar como segmentos temporales. Para aquellos manejados por el diccionario de datos si se puede. Uso de múltiples tablespaces Se pueden utilizar varios tablespaces para llevar a cabo las siguientes tareas • Control de la asignación del espacio del disco pata una base de datos. • Asignación de cuotas específicas para los usuarios de la base de datos. • Control de la disponibilidad de los datos mediante el estado online/offline de los tablespaces • Desarrollar backups parciales de la base de datos o operación de recuperación • Destinar el almacenamiento de los datos entre dispositivos para mejorar el desempeño. Manejando el espacio en los tablespaces: El manejo del espacio en los tablespaces se puede llevar a cabo mediante: • Tablespaces Locally Managed: el manejo de los extents es realizado por el tablespace • Tablespaces Dictionary Managed: el manejo de los extents es realizado por el diccionario de datos. El método para el manejo del espacio en un tablespace se especifica en el momento de la creación. Tablespaces Locally Managed: Un tablespace que maneja sus propios extents mantienen un bitmap en cada datafile para resguardar el registro del estado de los bloques con respecto a si están ocupados o libres en el datafile. Cada bit en el bitmap corresponde con un bloque o un grupo de bloques. Cuando un extent es asignado o liberado para su reutilización, Oracle cambia el valor del bitmap para reflejar el nuevo estado del bloque. Este cambio no genera información de rollback debido a que no actualiza las tablas en el diccionario de datos. Entre las ventajas sobre los tablespaces manejados por el diccionario de datos se tiene: • El manejo local de los extentes automáticamente registra la adyacencia del espacio libre, Clase 2: Estructuras lógicas y físicas(I) Claudia González ___________________________________________________________________________________ • eliminando la necesidad de fusionar los extents libres adyacentes. El manejo de los extents localmente evita operaciones de manejo de espacio recursivo. Como las que pueden ocurrir en los tablespaces manejados por el diccionario si el consumo o liberación de espacio en un extent resulta en otra operación que consume o libera espacio en una tabla del diccionario de datos o un segmento de rollback. ¿Cómo se libera el espacio libre y utilizado en un segmento? • • Automáticamente: Oracle utiliza bitmaps para manejar el espacio libre en el segmento. Un bitmap, es un mapa que describe el estado de cada bloque de datos en un segmento con respecto a la cantidad despacio en el bloque disponible para la inserción de registros. Mientras más o menos espacio este disponible en un bloque de datos, su nuevo estado es reflejado en el bitmap. Los bitmaps permite a Oracle manejar el espacio libre más automáticamente, de esta manera el manejo del espacio se denomina manejo automático del espacio del segmento. Manualmente: Oracle utiliza un free list para el manejo del espacio libre en un segmento. Free list son listas de los bloques de datos que tienen espacio disponible para la inserción de tuplas. Manejo manual. Tablespaces Dictionary Managed Para un tablespaces que maneja sus extents mediante el uso del diccionario de datos, Oracle actualiza las tablas apropiadas en el diccionario de datos siempre que un extent es asignado o liberado. Oracle además almacena información de rollback por cada actualización en las tablas del diccionario de datos. Como las tablas del diccionario de datos y los segmentos de rollback son parte de la base de datos, el espacio que ellos ocupan esta sujeto a las mismas operaciones de manejo de espacio de los otros datos. Datafiles Oracle crea un datafile para un tablespace mediante la asignación de una cantidad específica de espacio en disco más el overhead requerido para el encabezado del archivo. Clase 2: Estructuras lógicas y físicas(I) Claudia González ___________________________________________________________________________________ Cuando un datafile es creado, el espacio asignado en disco es reclamado y se le da un formato, pero no contendrá ningún dato del usuario. Oracle reserva el espacio para resguardar los datos para segmentos futuros asociados al tablespace. A medida que los datos crecen en el tablespace, Oracle utiliza el espacio libre en el datafile para asignarlo a los extents del segmento. Un objeto de un esquema no corresponde a un datafile específico. Un datafile es un repositorio para los datos de cualquier objeto en un tablespace específico. Oracle asigna espacio para los datos asociados con un objeto del esquema en uno o más datafiles de un tablespace. Por lo cual, un objeto puede atravesar más de un datafile. Estructura Física para el Almacenamiento de Datos en Tablas Las tablas son la unidad básica de almacenamiento de datos en Oracle, se puede escoger entre las siguientes estructuras físicas de almacenamiento para una tabla: Tablas Regulares Tablas heap. Tablas particionadas Permiten particionar los datos en piezas más pequeñas y manejables, llamadas particiones o aún subparticiones. Los índices pueden particionarse de la misma manera. Cada partición puede ser manejada individualmente y puede operar independientemente de otras particiones, proveiendo una estructura que puede ser entonada más apropiadamente para su disponibilidad y desempeño. Se toca en detalle en la siguiente clase. Tablas Organizadas por Índice Una tabla organizada por índice tiene una organización que es una variante del árbol B primario. De forma diferente a una tabla ordinaria (heap), cuyos datos son almacenadas como una colección no ordenada, los datos para una tabla organizada por índice son almacenados en un un árbol Clase 2: Estructuras lógicas y físicas(I) Claudia González ___________________________________________________________________________________ B, organizados por la clave primaria. Junto con las columnas de la clave primaria se almacenan el resto de las columnas también. Cada entrada en el árbol B contiene: <primary_key_value , non_primary_key_column_values> . Las tablas organizadas por índice son similares a la configuración de una tabla ordinaria y un índice en una o más de las columnas, pero en lugar de mantener por separado las dos estructuras, una para la tabla y otra para el árbol B, la base de datos mantiene solamente un único árbol B. En lugar de almacenarse un apuntador (rowid) para recuperar el registro en la tabla, se almacenan las columnas no claves. Tablas Organizadas por índice con área de Overflow Las entradas de un índice en un árbol B generalmente son bastante pequeñas, porque ellas consisten únicamente del valor de la clave y un apuntador (rowid). En las tablas organizadas por índice, sin embargo, las entradas del árbol B pueden ser grandes, porque ellas consisten de un registro completo. Esto podria afectar el desempeño en caso de ser registros muy grandes. Por ellos Oracle provee la clásula OVERFLOW, se puede especificar un tablespace de overflow, de ser necesario, y el registro se dividirá en dos partes, una que será almacenada en el árbol B y la otra el área de overflow. Las entradas en el árbol contendrán los valores de la clave primaria, opcionalmente algunas columnas no claves y un apuntador (rowid físico) señalando al área de overflow donde se encuentra el resto del registro. Con el OVERFLOW, se pueden utilizar dos cláusulas: PCTTHRESHOLD e INCLUDING, para controlar como Oracle determina cuando un registro debe ser almacenado en dos partes y a partir de cuál columna se particiona el registro. Usando PCTTHRESHOLD, se puede especificar el valor límite como un porcentaje del tamaño del bloque, si todas las columnas no claves pueden ser acomodadas en ese límite especificado, el registro Clase 2: Estructuras lógicas y físicas(I) Claudia González ___________________________________________________________________________________ no se particionará. De otra manera comenzando con la primera columna no clave que no pueda ser acomodada, el resto de las columnas no claves será almacenadas en el área de overflow. La cláusula INCLUDING permite especificar el nombre de la columna, entre las columnas no claves, durante la creación de la tabla, tal que el resto de las columnas que se encuentren después de esta columna serán almacenadas en el área de overflow. Aunque dependiendo del PCTTHRESHOLD, algunas columnas no claves que se encuentren antes de la columna especificada con la cláusula INCLUDING podrían tener que almacenarse en el área de overflow. Tablas Cluster Son una estructura física para almacenar los datos en una tabla. Un cluster es un grupo de tablas que comparten los mismos bloques de datos porque ellas comparten columnas comunes y son usadas juntas frecuentemente. Por ejemplo las tablas employees y departments comparten la columna department_id. Al clusterizar las tablas employees y departments, Oracle almacena físicamente todos los registro para cada departamento junto con su correspondientes empleados en el mismo bloque de datos, como se muestra a continuación: Entre las ventajas que ofrece esta estructura se tiene ● El I/O de disco reduce para los joins de las tablas clusterizadas. Clase 2: Estructuras lógicas y físicas(I) Claudia González ___________________________________________________________________________________ ● ● El tiempo de acceso mejora para los joins de las tablas clusterizadas. La clave del closter es almacenada sólo una vez en el cluster y en el índice del cluster, sin importar cuantos registros de diversas tablas la contengan. Por lo tanto, se requiere menos espacio para almacenar la estructura del cluster y el índice que las tablas no clusterizadas. Hash Clusters Los Hash cluster agrupan las tablas de datos en una manera similar al índice regular del cluster (que utiliza un índice en lugar de una función de hash). Sin embargo, un registro almacenado en un hash cluster se basa en el resultado de aplicar una función de hash al valor de la clave de los registros del cluster. Todos los registros con el mismo valor de la clave son almacenados juntos en el disco. Los Hash cluster son una mejor opción que el clúster regular con un índice o una tabla indexada cuando una tabla se requiere con frecuencia para consultas de igualdad (por ejemplo para retornar todos los registros para el departamento 10). El valor de la clave de hash resultante apunta directamente al área n disco que almacena los registros. Para usar hashing se debe crear un hash cluster y cargar las tablas en el cluster. Oracle almacena físicamente los registros de una tabla en el hash cluster y los retorna de acuerdo a los resultados de la función de hash. Oracle usa una función de hash para generar una distribución de los valores numéricos, llamados valores de hash, que esta basada en los valores específicos de la clave del cluster. ¿Oracle tiene una estructura de hash? Para una sóla tabla se puede usar el hash cluster como una estructura de hash simple.