SQL_EXEC_ID/SQL_EXEC_START columns are empty in gv$active_session_history and gv$session

Primero algo de historia ..

A partir de Oracle database 11g, se introdujeron las columnas sql_exec_id y sql_exec_start a las vistas gv$session, gv$active_session_history ( también presente en otras vistas como dba_hist_active_sess_history y gv$sql_monitor). La documentación de Oracle nos dice esto a un nivel muy básico :

https://docs.oracle.com/database/121/REFRN/GUID-79E97A84-9C27-4A5E-AC0D-C12CB3E748E6.htm

sql_exec_id : identificador de ejecución SQL
sql_exec_start : tiempo en que la ejecución inició.

Como bien saben, es básico en todo enfoque de análisis de performance(AAS,Time Model Statistics,etc) investigar la cantidad de ejecuciones que tuvo un determinado sql_id en un periodo en el tiempo. La actividad registrada en ASH es muestral, 1 sample cada segundo, de tal modo que usando las columnas sql_exec_id y sql_exec_start es posible agrupar los registros en la gv$active_session_history de un determinado sql_id y agruparlo por las columnas sql_exec_id y sql_exec_start para determinar que pertenecen a una misma ejecución.

Ejemplo : En oracle 10g si tu ejecutas un sql_id 30 veces y cada ejecución dura 5 segundos tendrás 150 registros asociados a dicha sentencia en la [g]v$active_session_history y no tendrás ninguna columna que te permita distinguir si ese sql_id se ejecutó 150 veces o 30 veces con duración de 5 segundos cada ejecución. Desde 11g esto es posible simplemente por agrupar sql_id, sql_exec_id y sql_exect start, de esta manera podriamos tener algo asi para determinar cuantas veces se ejecutó el sql_id 3hq6ux9mxuq78 en el intervalo de 09:00 am a 10:30 am :

select sql_id,sql_exec_id,sql_exec_start,count(*) duration
from gv$active_session_history
where sample_time
between to_date(’21-02-2019 09:00:00′,’DD-MM-YYYY HH24:MI:SS’)
and to_date(’21-02-2019 10:30:00′,’DD-MM-YYYY HH24:MI:SS’)
group by sql_id,sql_exec_id,sql_exec_start

sql_exec_id7

Como se habrán podido dar cuenta en la imagen anterior ( y seguramente mas de uno se habrá percatado durante un análisis de performance), que consultando la gv$active_session_history hay registros que tienen las columnas sql_exec_id y sql_exec_start vacias. Lo cual puede complicar el análisis y causar cierta confusión

De hecho, gran cantidad de registros en la [g]v$active_session_history y gv$session tienen vacia la columna sql_exec_id y sql_exec_start.

select sql_id,sql_exec_id,sql_exec_start from gv$active_session_history where sql_exec_id is null;

sql_exec_id5

Bueno…en su momento Oracle aperturó un bug ( el cual finalmente fue cerrado como “no bug”), debido a que se llegó a la conclusión de que es el comportamiento esperado bajo ciertas circunstancias.

Bug 18468509 : SQL_EXEC_START AND SQL_EXEC_ID SOMETIMES ARE NULL IN V$SESSION

De acuerdo al bug Oracle nos dice que sql_exec_id puede ser null en los siguientes escenarios :

1. The SQL is waiting on an enq TM
2. During parse
3. During LOAD AS SELECT step of the execution plan
4. Often during the last step in the plan like SELECT STATEMENT, INSERT
STATEMENT

sql_exec_id6

Verifiquemos esto con un ejemplo …

TEST CASE :

Como se puede apreciar el sql_id f66wk4yqwyzas tiene 4 registros, de los cuales en 3 de ellos las columnas sql_exec_id y sql_exec_start estan vacias.

select sample_time,sql_id,sql_child_number,sql_exec_id,sql_exec_start,sql_plan_hash_value,in_parse,in_hard_parse
from gv$active_session_history where sql_id=’f66wk4yqwyzas’ order by sample_time asc;

 

sql_exec_id1

select sample_time,sql_id,sql_child_number as child_number,sql_exec_id,sql_exec_start,
sql_plan_hash_value as PHV,in_parse,in_hard_parse from gv$active_session_history
where sql_id=’f66wk4yqwyzas’ order by sample_time asc;

sql_exec_id3

Efectivamente!!! en este caso el sql_id : f66wk4yqwyzas durante los 3 primeros samples se encontraba realizando un hard parse y entró a la fase de execution en el 4to sample.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s