# 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:

```plaintext
|* 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` :

```plaintext
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:

```plaintext
/*+ 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:

```plaintext
ALTER SESSION SET CONTAINER_DATA=CURRENT_DICTIONARY;
```

También puedes usar un trigger de logon para aplicarlo automáticamente:

```plaintext
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:

```plaintext
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.
