Guía rápida — Optimizar una base de datos Oracle
Resumen con prácticas clave, comandos de ejemplo y recomendaciones para aplicar en tu entorno Oracle.
1. Diseño de la base de datos
- Normaliza para evitar redundancia pero considera desnormalizar en tablas de solo lectura donde importe la velocidad de lectura.
- Particionamiento (RANGE, LIST, HASH) para tablas muy grandes; mejora parallel scans y mantenimiento.
- Índices: B-TREE para igualdad/rango; BITMAP para baja cardinalidad. Revisa índices no usados.
-- Ejemplo: crear partición por rango
CREATE TABLE ventas (
id NUMBER,
fecha_venta DATE,
importe NUMBER
)
PARTITION BY RANGE (fecha_venta) (
PARTITION p_2023 VALUES LESS THAN (TO_DATE('01-01-2024','DD-MM-YYYY')),
PARTITION p_2024 VALUES LESS THAN (TO_DATE('01-01-2025','DD-MM-YYYY'))
);
2. Optimización de consultas SQL
- Evita
SELECT *. Solicita solo columnas necesarias. - Usa bind variables para reusar planes y mejorar el cursor cache.
- Analiza planes con
EXPLAIN PLANyDBMS_XPLAN.DISPLAY_CURSOR.
-- Forzar bind variables (ejemplo en PL/SQL)
VAR1 := :b1; -- en aplicaciones usa placeholders
-- Ver plan de ejecución
EXPLAIN PLAN FOR
SELECT id, nombre FROM clientes WHERE ciudad = 'CABA';
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY());
3. Memoria y parámetros
- Ajusta SGA y PGA:
sga_target,pga_aggregate_target. Consideramemory_targetpara administración automática. - Revisa tamaño de redo logs y número de miembros. Evita archivos muy pequeños que causen frecuentes switches.
-- Ver parámetros actuales
SHOW PARAMETER sga_target;
SHOW PARAMETER pga_aggregate_target;
4. Mantenimiento y estadísticas
- Recolecta estadísticas regularmente:
DBMS_STATS.GATHER_TABLE_STATS. - Usa AWR, ADDM y SQL Tuning Advisor para recomendaciones automatizadas.
- Rebuild índices y compacta segmentos si hay mucha fragmentación.
-- Recolectar estadísticas de una tabla
BEGIN
DBMS_STATS.GATHER_TABLE_STATS(
ownname => 'SCHEMA_NAME',
tabname => 'MI_TABLA',
cascade => TRUE
);
END;
/
-- Ejecutar SQL Tuning Advisor (simplificado)
EXEC DBMS_SQLTUNE.CREATE_TUNING_TASK (...);
5. Concurrencia y bloqueo
- Evita transacciones largas que mantengan locks.
- Monitorea sesiones bloqueadas: consulta
V$SESSIONyV$LOCK.
-- Ver sesiones activas y bloqueos
SELECT s.sid, s.serial#, s.username, s.status, l.type
FROM v$session s
LEFT JOIN v$lock l ON s.sid = l.sid
WHERE s.username IS NOT NULL;
6. Herramientas Oracle recomendadas
OEM / Cloud Control
Monitoreo visual, AWR, métricas y alertas.
AWR / ASH / ADDM
Diagnóstico del rendimiento y recomendaciones.
SQL Tuning Advisor
Reescritura de queries y sugerencias de índices.
Checklist rápido
- ¿Están actualizadas las estadísticas? ✅
- ¿Índices utilizados y revisados? ✅
- ¿Consultas con bind variables? ✅
- ¿Monitoreo AWR/ASH activo? ✅
- ¿Particionamiento en tablas grandes? ✅