Consultas lentas a vistas AWR y del diccionario en PDB: el caso de EXTENDED DATA LINK FULL y cómo resolverlo

En entornos multitenant de Oracle Database (CDB/PDB), es habitual que ciertas consultas sobre vistas del diccionario o del AWR se comporten de forma inesperadamente lenta, incluso con filtros adecuados y bajo volumen de datos.
En este artículo te cuento un caso real que me encontré al trabajar con la vista DBA_HIST_SYSSTAT y cómo lo resolví gracias al parámetro oculto CONTAINER_DATA introducido a partir del bug 31142749.
El síntoma: consultas AWR lentas sin motivo aparente
Estaba trabajando en una consulta para calcular el número de transacciones por segundo a partir de las estadísticas AWR.
El SQL utilizaba DBA_HIST_SYSSTAT y DBA_HIST_SNAPSHOT con filtros muy concretos por SNAP_ID, DBID e INSTANCE_NUMBER. A pesar de ello, la ejecución era muy lenta:
A pesar de que esta consulta debería completarse en segundos, la ejecución tardaba varios minutos.
El plan de ejecución reveló la causa:
|* 17 | EXTENDED DATA LINK FULL | AWR_CDB_SYSSTAT |
Este paso era el responsable del mayor coste y retraso.
La causa: el bug 31142749 y las vistas con extended data link
El problema está relacionado con el bug 31142749 – QUERY ON ALL_ARGUMENTS SLOW IN 19.6 PDB
Para identificar los objetos que son susceptibles de provocar planes de ejecución con operaciones costosas como EXTENDED DATA LINK FULL, especialmente cuando se consultan desde una PDB sin ajustar el parámetro CONTAINER_DATA :
SELECT object_name, object_type, sharing
FROM dba_objects
WHERE sharing = 'EXTENDED DATA LINK';
La solución: usar el parámetro CONTAINER_DATA
Oracle introdujo el parámetro oculto CONTAINER_DATA a partir del parche 31142749 (incluido desde 19.10 RU - Enero 2021).
El parámetro CONTAINER_DATA controla el comportamiento de las consultas sobre objetos con extended data links tanto en aplicaciones comunes como en el diccionario de datos. Su valor determina qué datos devuelve una consulta cuando se ejecuta desde una PDB (pluggable database):
| Valor | Extended data-linked application common objects | Extended data-linked Oracle-supplied dictionary objects |
| ALL | Devuelve datos compartidos (application root) + datos locales de todas las PDBs relacionadas. | Devuelve datos del CDB root + datos de todas las PDBs relacionadas |
| CURRENT | Solo datos locales de la PDB actual. | Solo datos de la PDB actual. |
| CURRENT_DICTIONARY | Igual que ALL (root + local), pero limitado al contexto actual de aplicación. | Igual que ALL (root + PDB actual), pero sin incluir datos de otras PDBs. |
Formas de aplicarlo
Usar un hint en la consulta (solución más rápida)
En mi caso, el rendimiento se solucionó inmediatamente añadiendo este hint:
/*+ OPT_PARAM('container_data' 'current_dictionary') */
El plan de ejecución cambió y el paso EXTENDED DATA LINK FULL desapareció.
Cambiarlo a nivel de sesión
Para no modificar cada consulta individualmente:
ALTER SESSION SET CONTAINER_DATA=CURRENT_DICTIONARY;
También puedes usar un trigger de logon para aplicarlo automáticamente:
CREATE OR REPLACE TRIGGER set_container_data
AFTER LOGON ON DATABASE
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET CONTAINER_DATA=CURRENT_DICTIONARY';
END;
/
Cambiarlo a nivel de instancia (permanente)
Puedes configurarlo en el spfile y reiniciar la base de datos:
ALTER SYSTEM SET CONTAINER_DATA=CURRENT_DICTIONARY SCOPE=SPFILE;
Resultado: mejora inmediata del rendimiento
Tras aplicar el hint OPT_PARAM o ajustar la sesión, las consultas sobre DBA_HIST_SYSSTAT pasaron de tardar minutos a ejecutarse en segundos.
El plan de ejecución dejó de mostrar EXTENDED DATA LINK FULL, eliminando el acceso innecesario a datos del root.
Conclusión
Si trabajas con vistas AWR o del diccionario en una PDB y notas un rendimiento inesperadamente bajo, revisa el plan de ejecución.
Si ves un paso EXTENDED DATA LINK FULL, probablemente estés afectado por el bug 31142749.
La solución es aplicar el parámetro CONTAINER_DATA con el valor CURRENT_DICTIONARY, lo que restringe el acceso a datos del contenedor actual y evita un coste de ejecución innecesario.




