Biblioteca Online : ¡La Suscripción ENI por 9,90 € el primer mes!, con el código PRIMER9. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí

Gestión de las tablas e índices

Descripción general

De entre los principales tipos de objetos de un esquema, solo las tablas y los índices ocupan espacio de almacenamiento, más allá de su definición en el diccionario.

Este espacio de almacenamiento se debe planificar correctamente para evitar errores relacionados con la falta de espacio o problemas de rendimiento.

Las tablas y los índices son segmentos; por lo tanto el almacenamiento se organiza en extensiones, estando controlado por la cláusula STORAGE y por las características del tablespace. Por otra parte, la organización del almacenamiento en bloques es importante.

Existen otros tipos de objetos que ocupan espacio de almacenamiento aunque no se abordan en este libro:

  • Vistas materializadas: estructura análoga a una tabla y cuyo contenido se actualiza periódicamente a partir de una consulta SELECT.

  • IOT (Index Organised Table - tabla organizada en índice): tabla cuyo almacenamiento se organiza en el índice de la clave primaria de la tabla.

  • Clusters: estructuras que permiten almacenar físicamente el conjunto de tablas que se acceden frecuentemente usando joins.

  • Tablas e índices particionados: desde la versión 8, la opción particionamiento permite dividir el almacenamiento físico de las tablas e índices en porciones más pequeñas, llamadas particiones.

De la misma manera, existen varios tipos de índices:...

Gestión de las tablas

1. Organización del almacenamiento en los bloques

a. Conceptos generales

images/13_01.png

Estructura del bloque

El encabezado del bloque contiene la dirección del bloque, el tipo de segmento, un repositorio de tablas, un repositorio de registros y las entradas para las transacciones. El tamaño del encabezado del bloque es variable, entre 100 y 200 bytes. El resto del bloque contiene los datos (uno o varios registros de la tabla) y el espacio libre.

El encabezado se almacena en la parte inicial del bloque y los datos se insertan partiendo de la parte final. El encabezado es susceptible de crecer (hacia adelante) en función de la actividad en el bloque; nunca reduce su tamaño. Por ejemplo, si se insertan 100 registros en el bloque, el repositorio de registros ubicado en el encabezado crece; si a continuación se eliminan los registros, el repositorio de los registros no se reduce (el espacio se mantiene y se podrá reutilizar si hay registros que se insertan de nuevo en el bloque).

Estructura de un registro

El encabezado de un registro contiene alguna información del registro (nombre de columnas, eventual encadenamiento, bloqueo). El tamaño del encabezado del registro es variable (3 bytes como mínimo). A continuación, cada columna se almacena con un encabezado de columna (que define la longitud de la columna, de 1 a 3 bytes), seguida del valor de la columna.

La longitud total de un registro depende del número de columnas y del valor almacenado en cada columna. La longitud de la columna depende del tipo de datos.

Ejemplo:

Type

Longitud del almacenamiento

CHAR(n)

Longitud fija (n bytes), independiente del valor almacenado en la columna.

VARCHAR2(n)

Longitud variable (0 a n bytes), depende del valor almacenado en la columna.

NUMBER(x,y)

Longitud variable (entre 1 y 21 bytes), depende del valor almacenado en la columna.

DATE

Longitud fija (8 bytes).

CLOB, BLOB

Longitud variable, hasta 2ˆ32 - 1 bloques Oracle.

Un valor NULL ocupa un byte en mitad del registro y nada al final del registro.

Las funciones SQL VSIZE y DUMP aplicadas a un valor (columna, resultado de una expresión) permiten conocer, respectivamente, el tamaño en bytes del almacenamiento interno del valor y la representación interna del valor.

Conviene no olvidar que el bloque no solo contiene datos útiles; hay datos de control y de sobrecarga que Oracle utiliza de manera...

Gestión de los índices B-tree

1. Descripción general

Un índice es una estructura definida sobre una o varias columnas de una tabla; la columna o columnas constituyen la clave del índice.

El índice permite realizar un acceso rápido a los registros de la tabla en una búsqueda basada en la clave del índice. La noción de índice es análoga a la de índice de un libro: para buscar una palabra en un libro, es más rápido mirar primero en el índice, para obtener los números de las páginas que contienen la palabra. Un índice es física y lógicamente independiente de la tabla. Se puede crear/eliminar sin asignar la tabla de base (salvo impacto en el rendimiento, cuando el índice se elimina). Un índice necesita su propio espacio de almacenamiento.

Oracle utiliza y actualiza automáticamente los índices:

  • se utilizan durante las búsquedas, si una clave de índice se menciona en la cláusula WHERE de una consulta;

  • se actualizan en cada actualización (INSERT, UPDATE, DELETE).

La presencia o ausencia de un índice es completamente transparente para la aplicación; es Oracle el que los utiliza (o no) automáticamente.

El mantenimiento de los índices degrada el rendimiento de las actualizaciones.

Un índice puede ser único o no único:

  • Único: un valor de la clave de índice solo está presente una vez en la tabla.

  • No único: un valor de la clave de índice puede estar presente varias veces en la tabla.

Oracle aconseja no crear índices únicos explícitamente, sino definir restricciones de integridad (PRIMARY KEY o UNIQUE), para las que Oracle crea automáticamente índices únicos. Los índices no únicos, por el contrario, se deben crear explícitamente.

Un índice puede ser compuesto (o concatenado). En este caso, la clave del índice contiene varias columnas de la tabla; no siempre son adyacentes en la tabla, ni necesariamente tienen por qué estar ubicadas, dichas columnas, en el mismo orden que en la tabla.

Los valores NULL no se almacenan en los índices B-tree y, por tanto, no se tienen en cuenta frente a la unicidad: dos registros de la tabla pueden tener el valor NULL en la columna implicada.

2. Estructura de un índice...

Las estadísticas y el optimizador Oracle

El optimizador de Oracle se encarga de determinar el plan de ejecución de las consultas, es decir, la manera en la Oracle va a ejecutar la consulta.

Desde hace varias versiones, Oracle recomienda ejecutar el optimizador en modo CBO (Cost Based Optimizer - Optimizador basado en costes). Desde la versión 10 solo se soporta el modo CBO; el modo RBO (Rule Based Optimizer - Optimizador basado en reglas) ya no se soporta.

Para que el optimizador en el modo CBO funcione necesita estadísticas de las tablas, columnas e índices. Estas estadísticas se calculan con el paquete DBMS_STATS.

En las versiones anteriores, era responsabilidad del DBA programar una tarea periódica para recoger las estadísticas, con el objetivo de que el optimizador no trabajara con datos obsoletos.

Desde la versión 10, Oracle recoge automáticamente las estadísticas. Desde la versión 11, esta tarea se realiza mediante una tarea de mantenimiento automatizada.

Por defecto, esta tarea de mantenimiento recoge las estadísticas de los objetos de la base de datos que no tienen estadísticas o que tienen estadísticas obsoletas (si se ha modificado más del 10% de los registros del objeto subyacente); el procedimiento trata, de manera prioritaria, los objetos que más lo necesitan. Los argumentos de esta tarea automática se pueden configurar...

El asesor de segmentos

Entre las tareas de mantenimiento automatizadas, Oracle ejecuta un asesor de segmentos (Segmento Advisor). Este asesor identifica los segmentos que tienen espacio recuperable o que presentan un problema de migración. Si es necesario, el asesor de segmentos se puede ejecutar manualmente con ayuda del paquete DBMS_ADVISOR (consulte la documentación de Oracle).

Para consultar los resultados del asesor de segmentos puede consultar diferentes vistas del diccionario de datos (DBA_ADVISOR_RECOMMENDATIONS, DBA_ADVISOR_FINDINGS, DBA_ADVISOR_ACTIONS y DBA_ADVISOR_OBJECTS), aunque es más sencillo llamar a la función de tabla ASA_RECOMMENDATIONS del paquete DBMS_SPACE, que realiza los joins necesarios entre las diferentes vistas y devuelve el resultado en un formato más legible.

La especificación de esta función es la siguiente:


DBMS_SPACE.ASA_RECOMMENDATIONS 
   ( 
   all_runs        IN    VARCHAR2 DEFAULT: = TRUE, 
   show_manual     IN    VARCHAR2 DEFAULT: = TRUE, 
   show_findings   IN    VARCHAR2 DEFAULT: = FALSE 
   ) 
 RETURN ASA_RECO_ROW_TB PIPELINED;
 

Con:

all_runs

Si este argumento vale TRUE, la función devuelve los resultados de todas las ejecuciones automáticas del asesor. Si es igual a FALSE, solo se devuelve el resultado de la última ejecución automática. Este argumento no tiene sentido para las ejecuciones manuales del asesor.

show_manual

Si este argumento vale TRUE, la función devuelve los resultados de las ejecuciones manuales y automáticas del asesor. Si es igual a FALSE, los resultados de las ejecuciones manuales no se devuelven.

show_findings

Si este argumento vale TRUE, la función solo devuelve los resultados (findings) realizados por el asesor, pero no las recomendaciones. Si es igual a FALSE, solo se devuelven las recomendaciones.

Los ”resultados” (findings) corresponden a lo que el asesor ha podido observar en los segmentos analizados (espacio utilizado, espacio libre, presencia de registros migrados, etc.); los resultados no conducen forzosamente a las recomendaciones (si Oracle juzga que no hay realmente un problema con el segmento). Observe que en lo que respecta al problema de migración, el asesor solo genera un resultado, pero ninguna recomendación. 

La función...

Utilizar Oracle SQL Developer

EM Express no ofrece ninguna ventana para gestionar las tablas y los índices. Para ello, es posible utilizar Oracle SQL Developer.

1. Las tablas

En Oracle SQL Developer, la pestaña que se muestra durante la selección de una tabla en el panel Conexiones permite consultar las diferentes características de la tabla en varias pestañas:

images/13_504_1.png

Haciendo clic con el botón derecho sobre la carpeta Tablas en el panel Conexiones, se abre un menú contextual que fundamentalmente permite crear una nueva tabla (opción Nueva Tabla…):

images/13_505_1.png

Cuando se selecciona esta opción, se abre el siguiente cuadro de diálogo:

images/13_505_2.png

Este cuadro de diálogo simplificado permite definir una nueva tabla con las características básicas. Para tener acceso a más opciones puede hacer clic en la opción Avanzado:

images/13_506_1.png
Cuando hace clic en el icono images/13i01.png de la pestaña que muestra la estructura de la tabla, se abre un cuadro de diálogo similar que permite modificar una tabla:
images/13_507_1.png

Por otra parte, cuando se hace clic con el botón derecho en una tabla en el panel Conexiones, se despliegua un menú contextual que permite realizar diversas acciones con la tabla:

images/13_508_1.png

El menú Acciones… propuesto en la pestaña que muestra la descripción de una tabla ofrece más o menos las mismas acciones:

images/13_508_2.png

Con estos menús puede realizar diversas acciones sobre las tablas, entre...

Problemas habituales y soluciones

ORA-01653: imposible ampliar la tabla X. de N en el tablespace Y 
ORA-01654: imposible ampliar el índice X. de N en el tablespace Y 

Explicación

Un segmento (tabla o índice) no se puede ampliar.

Causa(s)

El segmento (tabla o índice) no se puede ampliar porque el tablespace en el que se almacena no tiene suficiente espacio disponible y no se puede ampliar.

Acción(es)

Hay que aumentar el espacio disponible en el tablespace:

  • asignándole un nuevo archivo de datos (ALTER TABLESPACE ... ADD DATAFILE ...);

  • o aumentando el tamaño de algún archivo de datos del tablespace (ALTER DATABASE DATAFILE ... RESIZE ...);

  • o autorizando que algún archivo de datos del tablespace se amplíe automáticamente (ALTER DATABASE DATAFILE ... AUTOEXTEND ON ...).

ORA-01631: alcanzado el número máximo de conjuntos de bloques contiguos (N) en la tabla X. 
ORA-01632: alcanzado el número máximo de conjuntos de bloques contiguos (N) en el índice X. 

Explicación

Un segmento (tabla o índice) no se puede ampliar.

Causa(s)

El segmento (tabla o índice) no se puede ampliar porque se almacena en un tablespace administrado por el diccionario y ha alcanzado su número máximo de extensiones, definido por MAXEXTENTS. Este problema no se puede producir si el segmento se almacena en un tablespace administrado localmente (número...