Oracle, como base de datos de gran tamaño, se utiliza ampliamente en organizaciones importantes con un gran rendimiento de datos y extensas redes informáticas, como finanzas, correos y telecomunicaciones, energía eléctrica y aviación civil. En cuanto a los administradores de sistemas, es particularmente importante garantizar el funcionamiento estable de la red y mejorar el rendimiento de la base de datos para hacerla más segura y eficiente. Como factor importante que afecta el rendimiento de la base de datos, la fragmentación de la base de datos debe despertar la atención suficiente del DBA. El descubrimiento y limpieza oportunos de fragmentos es un contenido de mantenimiento básico del DBA.
1. ¿Por qué ocurren los fragmentos?
Cuando se genera una base de datos, se dividirá en múltiples segmentos lógicos (Segmentos) conocidos como espacios de tabla (Tablespace), como el espacio de tabla del sistema (Sistema), el espacio de tabla temporal (Temporal), etc. Un espacio de tabla puede contener múltiples rangos de datos (Extensión) y uno o más bloques de rango libre, es decir, espacio libre (Espacio libre).
Las relaciones lógicas entre espacios de tabla, segmentos, categorías y espacios libres son las siguientes:
Cuando se crea un segmento en un espacio de tabla, se asignará espacio para el alcance inicial del segmento a partir del espacio libre efectivo del espacio de tabla. Cuando estos rangos iniciales se llenen con datos, el segmento solicitará la adición de otro rango. Este proceso de expansión continuará hasta que se alcance el valor máximo del rango y es posible que no quede espacio libre en el espacio de la tabla para el siguiente rango. La situación más ideal es que los datos de un segmento se puedan almacenar en una sola categoría. De esta manera, todos los datos se almacenan cerca de otros datos del segmento y se necesitan menos punteros para encontrar datos. Sin embargo, hay muchos casos en los que un segmento contiene varios campos y no hay forma de demostrar que estos campos estén almacenados cerca. Cuando se debe cumplir un requisito de espacio, la base de datos ya no cierra el rango libre adyacente (a menos que no haya manera), sino que busca el rango libre más grande en el espacio de tabla para usar. Esto irá formando paulatinamente espacios libres cada vez más discretos, separados, más pequeños, es decir, fragmentos.
2. Impacto de la fragmentación en el sistema
A medida que pasa el tiempo, el uso generalizado de sistemas de aplicaciones basados en bases de datos generará cada vez más fragmentos, lo que tendrá los dos impactos importantes siguientes en la base de datos:
1) Incurrir en una reducción del rendimiento del sistema
En general, cuando se debe cumplir con un requisito de espacio, la base de datos primero buscará el rango libre más grande en este momento, y el rango libre "más grande" gradualmente se vuelve más pequeño, y se vuelve cada vez más difícil encontrar un rango libre lo suficientemente grande. es difícil, por lo que los obstáculos de velocidad en el espacio de tabla hacen que la asignación de espacio de la base de datos se aleje cada vez más del estado ideal;
2) Distribuya una gran cantidad de espacio en la mesa
Aunque algunas áreas libres (como el aumento de pc del espacio de la tabla no es cero) se fusionarán periódicamente mediante el proceso del jefe en segundo plano SMON (monitoreo del sistema), siempre hay algunas áreas libres que no se pueden cerrar automáticamente, desperdiciando una gran cantidad de tabla. espacio. .
3. Cálculo de fragmentos de categorías gratuitas.
Debido a que la fragmentación del espacio libre se compone de varias partes, como el número de categorías, el tamaño máximo del rango, etc., podemos usar el valor FSFI - Índice de fragmentación del espacio libre (Índice de fragmentación del espacio libre) para reflejar intuitivamente:
FSFI=100*SQRT(max(extensión)/suma(extensiones))*uno/SQRT(SQRT(recuento(extensiones)))
Como puede verse, el valor máximo de FSFI es 100 (un espacio de tabla único ideal). A medida que aumenta el alcance, el valor de FSFI disminuye lentamente y, a medida que disminuye el tamaño máximo del alcance, el valor de FSFI disminuye rápidamente.
Se puede utilizar el siguiente script para calcular el valor de FSFI:
cálculo del valor rem FSFI
remfsfi.sql
formato de columna FSFI 999,99
seleccione tablespace_name,sqrt(max(bloques)/suma(bloques))*
(100/sqrt(sqrt(cuenta(bloques)))) FSFI
de dba_free_space
agrupar por tablespace_name ordenar por uno;
carrete fsfi.rep;
/
enrollar;
Por ejemplo, al ejecutar el script fsfi.sql en una determinada base de datos, se pierden los siguientes valores FSFI:
TABLESPACE_NAME FSFI
------------------------------- -------
74,06 rublos
SISTEMA 100.00
TEMPERATURA 22.82
HERRAMIENTAS 75,79
USUARIOS 100.00
USUARIO_HERRAMIENTAS 100.00
YDCX_DATOS 47.34
YDCX_IDX 57.19
YDJF_DATOS 33.80
YDJF_IDX 75,55
---- Una vez que se calcula el valor FSFI de la base de datos, se puede utilizar como parámetro comparable. En un espacio de tabla con suficiente espacio libre efectivo y un valor FSFI superior a 30, rara vez se encuentran problemas de espacio libre efectivo. Cuando un espacio se acerca a parámetros comparables, es necesario desfragmentarlo.
4. Clasificar los fragmentos de categorías gratuitas.
El valor de pctincrease del espacio de tabla no es cero
Puede cambiar el parámetro de almacenamiento predeterminado pctincrease del espacio de tabla a distinto de cero. Normalmente configúrelo en uno, como:
alterar la temperatura del espacio de tabla
almacenamiento predeterminado (pctincrease 1);
De esta forma, SMON agrupará automáticamente las categorías gratuitas. También puedes agrupar categorías gratuitas manualmente:
alterar la temperatura del espacio de tabla fusionarse;
5. Recogiendo los fragmentos del párrafo.
Sabemos que los segmentos se componen de categorías. En algunos casos, es necesario limpiar los fragmentos del segmento. Para ver información relacionada con segmentos, consulte el diccionario de datos dba_segments y, para obtener información sobre categorías, consulte el diccionario de datos dba_extents.
segmento de datos de consulta
seleccione nombre_segmento, nombre_espacio_tabla, bytes, bloques de USER_EXTENTS;
Segmento del directorio de consultas
seleccione nombre_índice, propietario_tabla, nombre_tabla, nombre_espacio_tabla de USER_EXTENTS;
Ver información del segmento a través de dba_segments
seleccione tablespacee_name,count(*) nobjects,round(suma(bytes)/1024/1204/1024.2) GB,suma(bloques),suma(extensiones) de
grupo dba_segments por resumen (tablespace_name);
Si un segmento está excesivamente fragmentado, la forma más sencilla de comprimir sus datos en un rango es reconstruir el segmento con los parámetros de almacenamiento correctos, luego insertar los datos de la tabla anterior en la tabla nueva y, al mismo tiempo, eliminar la tabla anterior. . Este proceso se puede realizar utilizando la herramienta Importar/Exportar (entrada/salida).
El comando Export () tiene un indicador (comprimido), que al leer la tabla hará que Export determine la cantidad de espacio físico asignado a la tabla y escribirá un nuevo parámetro de almacenamiento de inicialización en los datos del volcado de salida, es decir, todos Asignar espacio. Si esta tabla está cerrada, utilice la herramienta Importar () para regenerarla. De esta manera, sus datos se colocarán en un segmento inicial nuevo y más grande. Por ejemplo:
exp usuario/contraseña archivo=exp.dmp comprimir=Y otorga=Y índices=Y
tablas=(tabla uno, tabla dos);
Si la salida se realiza sin problemas, elimine la tabla exportada de la biblioteca y luego importe la tabla desde los datos del volcado de salida:
archivo de usuario/contraseña imp=exp.dmp commit=Y buffer=64000 full=Y