En Oracle Database la fragmentación de índices ocurre por la forma en que Oracle administra internamente las estructuras B-tree. Entender esto requiere mirar cómo se organizan los índices y cómo cambian con el tiempo.
1. Cómo está estructurado un índice en Oracle
La mayoría de los índices en Oracle son B-tree.
Un índice B-tree está compuesto por:
Root block: punto de entrada del índice.
Branch blocks: nodos intermedios.
Leaf blocks: contienen los valores indexados y los ROWID de la tabla.
Visualmente:
Root
/ \
Branch Branch
/ \ \
Leaf Leaf Leaf
Los leaf blocks están ordenados por la clave del índice.
2. Qué es la fragmentación de un índice
La fragmentación ocurre cuando los leaf blocks quedan con espacio libre o desordenados respecto al uso real del índice.
Esto suele pasar cuando:
- se insertan registros
- se borran registros
- se actualizan columnas indexadas
El resultado es:
- bloques medio vacíos
- más bloques de los necesarios
- más I/O al recorrer el índice
3. Cómo se fragmenta un índice
Caso 1 — Inserts aleatorios
Supongamos un índice sobre:
cliente_id
Insertamos:
10
20
30
40
50
Los leaf blocks quedan llenos y ordenados.
Pero si luego insertamos:
25
Oracle debe dividir el bloque.
Esto se llama: block split
Ejemplo:
Antes:
[10 20 30 40 50]
Después:
[10 20 25]
[30 40 50]
Cada split genera:
- más bloques
- más profundidad en el árbol
Caso 2 — Deletes
Supongamos que borramos muchos registros:
DELETE FROM ventas
WHERE fecha < SYSDATE - 365;
Los bloques del índice quedan así:
[10 _ _ _]
[20 _ _ _]
[30 _ _ _]
Oracle no compacta automáticamente los bloques.
Resultado:
- muchos bloques
- con poco contenido
Esto es fragmentación lógica.
Caso 3 — Updates en columnas indexadas
Si actualizas una columna indexada:
UPDATE clientes
SET cliente_id = 900
WHERE cliente_id = 20;
Oracle hace internamente:
DELETE + INSERT en el índice
Esto produce nuevamente:
- splits
- huecos
4. Tipos de fragmentación
Fragmentación interna
Bloques con mucho espacio libre.
Ejemplo:
[10 _ _ _]
Problema:
- se necesitan más bloques para recorrer el índice.
Fragmentación externa
Los bloques están fuera de orden físico en disco.
Esto afecta:
index range scans
Porque Oracle debe saltar más bloques.
5. Cuándo ocurre más fragmentación
Situaciones típicas: índices sobre columnas con valores aleatorios
Ejemplo:
UUID
hash
random_id
Cada insert puede generar splits y muchas eliminaciones
updates frecuentes: especialmente sobre claves indexadas.
6. Cómo saber si un índice está fragmentado
Oracle permite analizar índices:
ANALYZE INDEX idx_clientes VALIDATE STRUCTURE;
Luego consultar:
SELECT
height,
lf_rows,
del_lf_rows,
lf_blks
FROM index_stats;
Indicadores importantes:
DEL_LF_ROWS → filas eliminadas
LF_BLKS → bloques leaf
Si hay muchos DEL_LF_ROWS, puede haber fragmentación.
Otra forma:
SELECT
index_name,
blevel,
leaf_blocks,
num_rows
FROM user_indexes;
Si leaf_blocks crece mucho respecto a num_rows, puede haber fragmentación.
7. Cómo desfragmentar índices
Hay dos formas principales.
COALESCE (la más segura)
ALTER INDEX idx_clientes COALESCE;
Qué hace:
- fusiona leaf blocks vacíos
- no bloquea la tabla
- no requiere espacio extra
Ventajas:
- online
- rápido
Limitación:
- no reorganiza completamente el índice.
REBUILD
ALTER INDEX idx_clientes REBUILD;
Qué hace:
- recrea completamente el índice
- elimina fragmentación
- reorganiza bloques
Resultado:
- índice más compacto
- mejor locality en disco
También existe:
ALTER INDEX idx_clientes REBUILD ONLINE;
8. ¿Hay que desfragmentar índices regularmente?
En Oracle generalmente NO. Oracle maneja bastante bien los índices.
Solo conviene hacerlo cuando:
- muchos deletes
✔ índices muy grandes
ejemplo:
```
millones de registros
```
---
### ✔ degradación visible de performance
queries que antes usaban:
```
INDEX RANGE SCAN
```
y ahora son más lentas.
---
9. Caso donde casi nunca hay fragmentación
Si el índice es sobre:
ID autoincremental
los inserts siempre van al final del índice.
Ejemplo:
1
2
3
4
5
Esto produce casi cero splits.
Es el caso ideal.
10. Regla práctica en Oracle
No hagas mantenimiento automático de índices sin evidencia.
Recomendación típica de DBAs:
- monitorear
- usar COALESCE
- usar REBUILD solo si es necesario
En Microsoft SQL Server la fragmentación de índices es mucho más problemática y suele requerir mantenimiento periódico.
En Oracle Database, en cambio, es mucho menos común tener que intervenir.










