Estadísticas Extendidas en Oracle 12c: Cómo, Cuándo y Riesgos

Estadísticas Extendidas en Oracle 12c: Cómo, Cuándo y Riesgos

En el día a día de la administración de bases de datos, nos enfrentamos a un dilema constante: el equilibrio entre rendimiento y estabilidad. Oracle nos ofrece un conjunto de herramientas muy poderosas para ayudar al optimizador de consultas a tomar mejores decisiones, y entre ellas destacan las estadísticas extendidas.

Son útiles, sí. Pueden ser la diferencia entre una consulta que tarda segundos y otra que se arrastra durante minutos. Pero también tienen un lado menos amable: cuando se usan sin control, pueden generar dependencias ocultas, columnas virtuales invisibles e incluso problemas serios al eliminarlas sin una estrategia.

Las estadísticas extendidas nacen para resolver una limitación del optimizador de Oracle. Normalmente, las estadísticas se generan por columna, y el motor asume que cada columna es independiente de las demás. En la práctica sabemos que eso casi nunca es así: columnas como país y ciudad, o fecha de inicio y fecha de fin, tienen una relación directa que impacta las consultas.

Puede confundir al optimizador si no hay estadísticas sobre esa expresión, porque no sabe cuántos registros cumplen esa condición.

Escenarios de las estadísticas extendidas

  • Estadísticas multicolumna (column groups): ayudan a capturar correlaciones entre columnas.
  • Estadísticas sobre expresiones: permiten medir la selectividad real de funciones y transformaciones en filtros.
  • Estadísticas multicolumna: Para entender las correlaciones en las estadisticas multicolumnas, imaginemos un sistema de pedidos (REGISTRO_ENVIOS) donde cada fila tiene un PAIS y una CIUDAD. Si pedimos: 
SELECT * FROM REGISTRO_ENVIOS
WHERE PAIS = 'Italia'
  AND CIUDAD = 'Roma'
  AND PEDIDO_ELECTRONICO IN ('iPhone 15 Pro', 'MacBook Air M3', 'Nintendo Switch OLED');

El optimizador, sin estadísticas multicolumna, tratará PAIS y CIUDAD como si fueran atributos totalmente independientes. En el mundo real sabemos que ciudades y países están ligadas: la ciudad Roma probablemente solo existe dentro del país Italia.  El resultado, Oracle puede calcular cardinalidades erróneas y elegir planes ineficientes.

La solución es sencilla: crear un grupo de columnas como estadística extendida:

BEGIN DBMS_STATS.CREATE_EXTENDED_STATS(
ownname => 'SYSTEM',
 tabname => 'REGISTRO_ENVIOS',
 extension => '(PAIS, CIUDAD)
);
 END;

Con esto, Oracle entiende la relación y ajusta sus estimaciones. Esto no solo mejora el rendimiento de las consultas, sino que también hace que los planes de ejecución sean más consistentes.

  • Estadísticas sobre expresiones: cuando los filtros no son directos. Otro caso común ocurre con expresiones. Pensemos en la típica búsqueda insensible a mayúsculas:
SELECT * FROM empleados
WHERE UPPER(CIUDAD) = 'BOGOTA';

Aquí el optimizador no sabe si ese filtro devuelve una fila, mil o diez mil. El resultado suele ser un escaneo completo.

Podemos ayudarlo creando una estadística sobre la expresión:

BEGIN
  DBMS_STATS.CREATE_EXTENDED_STATS(
    ownname   => 'SYSTEM',
    tabname   => 'REGISTRO_ENVIOS',
    extension => '(UPPER("CIUDAD"))'
  );
END;

De esa forma, Oracle “aprende” qué tan selectivo es aplicar UPPER sobre CIUDAD y elige un plan más ajustado.

Riesgos y problemáticas

Hasta aquí todo suena ideal, pero hay que hablar de los riesgos, especialmente en entornos críticos.

  • Columnas virtuales ocultas.

Al crear una estadística extendida, Oracle puede generar columnas internas que no vemos a simple vista. Algunas de ellas incluso pueden estar ligadas a índices. Eliminar estas estadísticas sin cuidado puede dar errores como:

Es decir no todo lo que aparece en DBA_STAT_EXTENSIONS es eliminable.

  • Dependencia de planes de ejecución.

Si un aplicativo se ha acostumbrado a un plan generado con estadísticas extendidas, eliminarlas puede cambiar radicalmente el comportamiento de las consultas. Lo que antes duraba segundos puede dispararse a minutos.

  • Impacto en aplicaciones externas.

En entornos donde usamos ERP, CRM o aplicaciones de terceros, estas estadísticas pueden haber sido creadas como parte de la configuración inicial. Si desaparecen, los reportes pueden fallar o rendir mal.

  • Dificultad de rollback.

Si borramos sin un respaldo apropiado, no hay manera de “volver atrás”. El sistema tiene que recomputar desde cero y eso abre la puerta a inconsistencias o caídas de rendimiento inesperadas.

  • Cómo deshabilitarlas y borrarlas con seguridad

Deshabilitar la creación automática

Oracle puede crear estas estadísticas de forma automática si está activado el parámetro AUTO_STAT_EXTENSIONS. Para evitar sorpresas:

EXEC DBMS_STATS.SET_GLOBAL_PREFS('AUTO_STAT_EXTENSIONS', 'OFF');

De esta forma, solo existirán las que decidamos crear manualmente.

  • Respaldar antes de tocar nada

La mejor práctica es siempre exportar las estadísticas actuales a una tabla de backup:

BEGIN
  DBMS_STATS.CREATE_STAT_TABLE( ownname => 'SYSTEM', stattab => 'STATS_BACKUP' );
  DBMS_STATS.EXPORT_DATABASE_STATS( stattab => 'STATS_BACKUP', statown => 'SYSTEM' );
END;

Esto incluye también las estadísticas extendidas. Si algo sale mal, podemos restaurarlas con:

BEGIN
  DBMS_STATS.IMPORT_DATABASE_STATS(
    stattab => 'STATS_BACKUP',
    statown => 'SYSTEM'
  );
END;
  • Eliminar solo lo necesario

Podemos usar un script que elimine las estadísticas extendidas de todos los esquemas, excluyendo los esquemas del sistema, sin embargo, esto puede generar los errores mencionados anteriormente, por lo cual, la mejor alternativa, es ser selectivo con las estadísticas extendidas a borrar:

BEGIN
      DBMS_STATS.DROP_EXTENDED_STATS(
        ownname   => rec.owner,
        tabname   => rec.table_name,
        extension => rec.extension
      );

Buenas prácticas en entornos empresariales

Cuando hablamos de estadísticas extendidas en una base de datos de produccion, la recomendación principal es la prudencia. Estas son algunas buenas practicas que se pueden aplicar:

No dependas de la creación automática, controlar qué estadísticas se generan evita sorpresas y asegura coherencia en los planes.

Siempre respalda antes de borrar, exportar las estadísticas te da una “red de seguridad” para revertir cambios.

Recuerda que en DBA Experts siempre contamos con el equipo de expertos apropiados para optimizar consultas y que puedas tomar mejores decisiones estratégicas dentro de tu empresa.

cerrar