Translate

jueves, 12 de marzo de 2026

Fragmentación de índices en oracle


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.