Dos lecturas completan el perfil: el mismo tiempo agrupado por la clase de espera de Oracle, que muestra de qué tipo es la espera, y el tiempo del SQL recursivo, que muestra cuánto gasta una sentencia en las sentencias que dispara.
Qué muestra la sección
Justo debajo del perfil, la tabla Por clase de espera suma los componentes por la clase de Oracle (wait_class), con la CPU y el tiempo no contabilizado como clases propias. La suma de las filas también es el tiempo total. La clase de cada evento sigue la v$event_name de Oracle 19c; los eventos gc quedan en Cluster, y un evento que WaitScope no sabe clasificar queda en No clasificado.
| Clase | Qué agrupa |
|---|---|
| Idle | La sesión esperando trabajo. En un trace de sesión, casi siempre es SQL*Net message from client: tiempo de la aplicación, de la red y del usuario. |
| Network | Datos enviados y recibidos por SQL*Net, con la aplicación o con otra base de datos por dblink. |
| User I/O | Lecturas y escrituras de datos hechas por la propia sesión. |
| System I/O | I/O de los procesos en segundo plano que la sesión esperó. |
| Commit | La escritura del redo en el COMMIT (log file sync). |
| Application | Fila o tabla retenida por otra sesión, locks de la propia aplicación, errores devueltos. |
| Concurrency | Contención por estructuras internas: latches, mutexes, buffers. |
| Configuration | Un límite de configuración: redo log, buffer cache, ITL, caché de secuencia, espacio. |
| Scheduler | El Resource Manager reteniendo la sesión. |
| Cluster | Bloques y mensajes intercambiados entre las instancias del RAC. |
| Administrative y Other | Comandos de administración y eventos internos sin una clase más específica. |
| CPU y No contabilizado | Los componentes de CPU y los dos tiempos no contabilizados del perfil. |
| No clasificado | Eventos que WaitScope no sabe clasificar. |
Cómo leerla
| Columna | Qué indica |
|---|---|
| Clase | El nombre de la clase. Haga clic en él para abrir la tarjeta, con Normal cuando, Preocupa cuando y Dónde mirar, como en el perfil. |
| Duración (s) | La suma de los componentes de la clase. |
| % del total | La parte del tiempo total, con la barra al lado. |
| Ocurrencias | La suma de las ocurrencias de los componentes. En blanco en No contabilizado. |
| Componentes principales | Los componentes que más pesan en la clase, en el orden del perfil. |
Para un evento en No clasificado, su clase en la base de datos está en la v$event_name:
select name, wait_class
from v$event_name
where name = 'nombre del evento';
SQL recursivo
El SQL recursivo es la sentencia que ejecuta otra sentencia, y no la aplicación: el SQL dentro de funciones y procedimientos PL/SQL, el de los triggers y las consultas que la propia base de datos hace al diccionario. En el trace, tiene dep= mayor que 0. El informe muestra ese tiempo en cuatro lugares:
- En Sentencias SQL, la columna Prof. es 0 en la sentencia invocada por la aplicación y 1 o más en la recursiva. La recursiva casi siempre tiene contribución cero: su tiempo ya está en la llamada de nivel 0 que la disparó. Su tiempo propio está en Inclusivo (s).
- En el detalle de la sentencia, la tarjeta Profundidad dice invocada por la aplicación o SQL recursivo.
- En el Perfil de la sentencia, la fila SQL recursivo (sentencias hijas), de tipo recursivo, suma la duración de las llamadas que disparó la sentencia. Su tarjeta dice que es normal en una sentencia PL/SQL que ejecuta otros SQL y que preocupa cuando suma mucho en un SELECT o DML simple: función PL/SQL llamada por fila, o trigger pesado.
- Al final del detalle, SQL recursivo ejecutado por esta sentencia lista las sentencias hijas que más tardaron, de la que más tardó a la que menos, con un enlace al detalle de cada una.
En Sentencias por componente, el tiempo de cada componente queda en la sentencia que lo gastó: la lectura hecha por el SQL recursivo cuenta en la sentencia hija, no en la que la disparó.
Cuándo preocupa
Cuando estas clases pesan en el tiempo total, el Diagnóstico muestra un hallazgo propio, de gravedad media, con el enlace Ver perfil por clase. Los de Application, Concurrency y Commit suben a alta cuando la clase pesa mucho.
| Clase | Hallazgo |
|---|---|
| Application | Espera por bloqueo de otra sesión |
| Concurrency | Contención por estructuras internas de la base de datos |
| Commit | Mucho tiempo esperando la escritura del redo en el commit |
| Configuration | Espera ligada a la configuración de la base de datos |
| Cluster | Intercambio de bloques entre instancias del RAC |
| Scheduler | Sesión limitada por el Resource Manager |
| CPU | La CPU domina el tiempo de respuesta |
En el SQL recursivo, preocupan la fila SQL recursivo (sentencias hijas) alta en una sentencia simple y la sentencia recursiva ejecutada miles de veces con una fila por ejecución: es un bucle en PL/SQL (fila a fila en PL/SQL).
Adónde ir después
- Tabla por clase del informe de ejemplo: Idle con el 71,3% del tiempo total, User I/O con el 18,5%.
- Sentencia #1 del ejemplo: en el perfil de la sentencia, la fila SQL recursivo (sentencias hijas) suma 0,000390 s, y la hija aparece al final. La sentencia #2 es esa hija, con profundidad 1.
- Sentencias por componente y por clase, para ver qué sentencias gastaron el tiempo de cada clase.