Skip navigation

Oracle 19c Database Logo.png

Auto Indexing es un sistema experto que emula el trabajo que un especialista en performance realiza normalmente en una base de datos. El mismo supervisa la carga de trabajo en la base de datos y determina si hay algún índice que pueda ayudar a mejorarla.

 

A diferencia de los asesores de índices ya existentes en versiones anteriores de Oracle, el indexado automática no se limita a recomendaciones sino que valida las mismas (construye los índices y prueba las sentencias que se verían afectadas), e identifica sentencias que pueden ser perjudicadas por la existencia del nuevo índice, generando un SQL Plan Baseline para evitar que el nuevo índice afecte a la sentencia.

 

Automatic Indexing.png

 

Este es un proceso iterativo, el cual se ejecuta de manera periódica y posee mecanismos de aprendizaje que mejoran el proceso de recomendación de índices. Asimismo, para evitar mantener indices innecesarios, aquellos índices generados por en indexado automático que ya no son útiles son eliminados por el mismo proceso, reduciendo la sobrecarga generada por indices innecesario al ejecutar sentencias de DML sobre las tablas afectadas.

 

La configuración y administración de esta funcionalidad se hace mediante el nuevo paquete DBMS_AUTO_INDEX.

 

Activando o Desactivando Autimatic Indexing

Es posible activar esta nueva funcionalidad de dos formas, ya sea en modo Implement (que genera los indices y los deja visibles) o en modo Reports (donde los índices quedan en modo invisible y no son utilizados por las sentencias):

 

EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','IMPLEMENT');
EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','REPORT ONLY');

 

Para des-habilitar la función, también se usa el paquete DBMS_AUTO_INDEX:

 

EXEC DBMS_AUTO_INDEX.CONFIGURE('AUTO_INDEX_MODE','OFF');

 

Para ver mas detalles sobre la configuración y mas opciones de esta nueva característica, se puede consultar la documentación oficial.

Oracle 19c Database Logo.png

La versión 19c de la base de datos Oracle incluye una interesante mejora a la función LISTAGG, largamente solicitada y esperado por los desarrolladores.

 

La versión 12.2 ya introdujo algunas mejoras realmente interesantes, las cuales ya compartí en este articulo Oracle 12c R2 - LISTAGG y OVERFLOW.

 

Ahora es posible eliminar los valores repetidos utilizando la opción DISTINCT. Veamos el siguiente ejemplo (tomado del blog de Connor McDonald):

 

SELECT deptno,
       listagg(job,',') WITHIN GROUP ( ORDER BY job) AS jobs
FROM scott.emp
GROUP BY deptno
ORDER BY 1;

DEPTNO    JOBS
--------- --------------------------------------------------
10        CLERK,MANAGER,PRESIDENT
20        ANALYST,ANALYST,CLERK,CLERK,MANAGER
30        CLERK,MANAGER,SALESMAN,SALESMAN,SALESMAN,SALESMAN

 

Ahora es muy sencillo eliminar los valores duplicados simplemente utilizando la opción DISTINCT:

 

SELECT deptno,
       listagg(distinct job,',') WITHIN GROUP ( ORDER BY job) AS jobs
FROM scott.emp
GROUP BY deptno
ORDER BY 1;

DEPTNO    JOBS
--------- --------------------------------------------------
10        CLERK,MANAGER,PRESIDENT
20        ANALYST,CLERK,MANAGER
30        CLERK,MANAGER,SALESMAN

 

Si quieren probarlo ustedes mismo, nada mejor que los ejemplos disponibles en Oracle Live SQL (entorno de base de datos gratuito en la nube provisto por Oracle).

 

También es útil revisar la sintaxis completa de la función LISTAGG en la documentación de Oracle 19c.