Explain Plan de una Sesión Activa

Esta es la situación. Se está monitorizando un sistema en el que un proceso de usuario Oracle está haciendo un uso intensivo de la CPU (se puede comprobar con la instrucción top en Linux, o con taskmgr.msc en Windows). Y me estoy refiriendo a un proceso que ya lleva bastante tiempo en el sistema usando cotas cercanas al 100% de la CPU. Evidentemente, puede existir algún proceso puntual que alcance esos picos, pero cuando hay algún proceso que lleva demasiado tiempo en el sistema apropiándose de la CPU, es seguro que todo lo demás se va a ralentizar y las quejas comenzarán a llegar más pronto que tarde. Es necesario determinar quién es el responsable y qué está ejecutando.

Como es habitual en este blog, las instrucciones que se describen son aplicables a una base de datos Oracle sobre un sistema Linux.

En primer lugar, es preciso determinar cual es el identificador del proceso en el sistema operativo, el PID. Para ello bastará con ejecutar la instrucción top. El proceso responsable aparecerá claramente destacado. Para muestra, un ejemplo:

En este ejemplo se observa claramente como el proceso con PID 687 está usando el 99% de la CPU, y la carga de la máquina (el load average) comienza a no ser óptimo.

En primer lugar hay que determinar cual es el SID que se corresponde con ese PID. Para ello se puede usar un script sql como el siguiente:

set linesize 140
set pagesize 100
col username format a15
col machine  format a20
ACCEPT proceso prompt ‘Pid : ‘
select s.inst_id,p.spid,s.sid,s.serial#,s.username,s.machine
from gv$session s, gv$process p
where s.paddr=p.addr
and p.spid=&proceso;
set linesize 140

set pagesize 100

col username format a15

col machine  format a20

ACCEPT proceso prompt 'Pid : '

select s.inst_id,p.spid,s.sid,s.serial#,s.username,s.machine

from gv$session s, gv$process p

where s.paddr=p.addr

and p.spid=&proceso
/

Una vez se tiene el SID, vamos a ver qué está ejecutando. Para ello, se ejecutaría algo así.

set lines 140

set pages 10000

set long 1000000

ACCEPT proceso prompt 'Sid : '

SELECT

    a.sql_id, a.sql_fulltext

FROM

    v$sqlarea a

  , v$session s

WHERE

      a.address = s.sql_address

  AND s.sid = &proceso

/

A parte de la sentencia SQL en sí, es muy importante el valor sql_id, ya que es el que se usará para conocer el plan de ejecución (explain plan) de la sentencia que se está ejecutando. Para conocer este explain plan, se lanza la última consulta:

set lines 150

set pages 40000

col operation format a55

col object format a25

ACCEPT sentencia prompt 'Identificador de SQL ejecutado : '

select

lpad(' ',2*depth)||operation||' '||options||decode(id, 0, substr(optimizer,1, 6)||' 
                   Cost='||to_char(cost)) operation,

object_name object,

cpu_cost,

io_cost

from v$sql_plan where sql_id='&sentencia'

/

Evidentemente, todo esto se puede agrupar en una sola consulta. Sería algo laborioso, y quizás no quedaría tan claro como haciéndolo paso a paso, pero por su puesto ofrecería el resultado deseado (el explain plan) mucho más rápido. En fin, si alguien se pone, le agradecería que compartiera el resultado conmigo🙂.

One Response to Explain Plan de una Sesión Activa

  1. Pingback: Explain Plan de una Sesión Activa - DbRunas

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 )

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 )

Google+ photo

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

Conectando a %s

A %d blogueros les gusta esto: