A veces conforme el tiempo avanza, nuestra base de datos va teniendo tiempos de respuesta más altos. Entre otras razones, una muy importante de ellas es la fragmentación.
Para atacar este problema, les proponemos lo siguiente:
- Para versiones igual o superiores a Oracle 8i, utilicen tablespaces administrados localmente (Locally-Managed tablespaces).
Nota: Recuerda que si tienes tablespaces "dictionary-managed" y versión mayor o igual a 8.1.6, puedes migrarlos a locally-managed con el paquete "dbms_space_admin".
Ejemplo para convertir el tablespace USERS_TBS a locally-managed:
exec dbms_space_admin.tablespace_migrate_to_local('USERS_TBS');
O si deseas hacer lo inverso (de local a diccionario)
exec dbms_space_admin.tablespace_migrate_from_local('USERS_TBS');
- Configura tu tablespaces para que el tamaño de los extents sea uniforme (Initial y Next).
- Emplea el comando COALESCE: alter tablespace USERS_TBS coalesce;
Este comando tratará de juntar los espacios libres de los segmentos en uno solo.
Y una de las más importantes:
- Revisa constantemente la fragmentación manualmente (puedes crear un script para que lo haga automático cada fin de semana).
Supongamos que tienes un índice de una tabla grande, que sabes que es constantemente modificada. Haz lo siguiente para eliminar finalmente la fragmentación de ésta:
Recuerda tomar tus precauciones, ya que las siguientes operaciones pueden afectar severamente el performance de tu BD.
SQL> analyze index Mi_SCHEMA.INDICE_IX validate structure;
Índice analizado.
SQL> select NAME, DEL_LF_ROWS from index_stats;
NAME DEL_LF_ROWS
------------------------------ -----------
INDICE_IX 205
Notas:
*Index_stats tendrá la información solamente del último índice que analizaste.
*El segundo campo (DEL_LF_ROWS) nos indica qué tan fragmentado está. Ese número velo como la cantidad de espacios no usados ni usables, en tu índice.
SQL> alter index Mi_SCHEMA.INDICE_IX rebuild nologging tablespace INDEX_TBS;
Índice modificado.
Notas:
*Reconstrucción del índice totalmente en línea
*Recuerda que si tienes un ambiente configurado con replicación avanzada, evita el uso de operaciones NOLOGGING.
SQL> analyze index Mi_SCHEMA.INDICE_IX validate structure;
Índice analizado.
SQL> select NAME, PARTITION_NAME, DEL_LF_ROWS from index_stats;
NAME DEL_LF_ROWS
------------------------------ -----------
INDICE_IX 0
Como puedes ver en el último query, ya no tenemos esos "huecos", por lo que el rendimiento será beneficiado increíblemente.
También puedes ahora revisar el espacio libre y el recuperable, con el siguiente query:
Nota: El SMALLEST te indicará la menor cantidad de MB a la cual podrás reducir tu data file. Obtendrás un "ORA-03297", si intentas reducirlo a un número menor que esos.
select value from v$parameter where name = 'db_block_size'
/
col FILE_NAME format a75
set linesi 220
select file_name,
ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) smallest,
ceil( blocks*&&blksize/1024/1024) currsize,
ceil( blocks*&&blksize/1024/1024) -
ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) savings
from dba_data_files a,
( select file_id, max(block_id+blocks-1) hwm
from dba_extents
group by file_id ) b
where a.file_id = b.file_id(+)
/
Saludos
{mosimage}
Carlos Contreras
Oracle Certified DBA