Query per vedere informazioni delle sessioni ATTIVE che consumano più risorse

.

Con l’articolo Query per vedere i dettagli delle sessioni ATTIVE
che consumano più risorse macchina,
forniamo una query per analizzare le sessioni ATTIVE
che utilizzano maggiormente le risorse disponibili.

Inoltre selezioniamo i campi SID,
SQL_ID,
l’utente con cui viene aperta la sessione,
l’utente del sistema operativo
e l’evento associato alla sessione.

Infine vediamo l’utilizzo di risorse
oltre al numero di esecuzione,
ossia quante volte è stata eseguita e la durata di attesa.

I campi selezionati sono:


INST_ID – Numero identificativo dell’istanza del RAC.
SID – Numero identificativo della sessione.
USERNAME – Nome utente con cui è stata eseguita la sessione.
SQL_ID – Numero identificativo dello statement
PROGRAM – Software da cui è partita la sessione
MACHINE – Nome macchina da cui è partita la sessione
OSUSER – Nome utente del sistema operativo da cui è partita la sessione
EXECUTIONS – Numero totale di esecuzione dello statement
BUFFER_GETS – Memoria utilizzata effettuate da ogni singola esecuzione
DISK_READS – Letture disco effettuate da ogni singola esecuzione
ELAPSED_TIME – Tempo di esecuzione di ogni singola esecuzione

Le informazioni sono recuperate dalle tabelle
GV$SESSION e
GV$SQL,
le quali sono messe in relazione dalle JOIN
a.INST_ID=b.INST_ID,
a.SQL_ID=b.SQL_ID,
a.SQL_CHILD_NUMBER=b.CHILD_NUMBER.

Infine filtriamo i record per sessioni attive e
per un valore di BUFFER_GETS per esecuzione
superiore a 90000 e
per un valore di DISK_READS per esecuzione
superiore a 5000.


col inst_id for 9999 col sid for 99999 col LAST_LOAD_TIME for a22 col buff_gets for 99999999999 col executions for 99999999999 col sql_text for a100 wrap set long 10000 col osuser for a10 col machine for a12 col buff_get for 99999999999 col program for a34 col Secs for 999,99 col username for a12 col disk for 999999 col cld for 99 col exec for 999999 set linesize 400 col Is for 9 select a.inst_id as I , a.sid, a.username , a.sql_id, a.program ,machine , osuser,executions as exec , BUFFER_GETS/(executions+1) as buff_get, disk_reads/(executions+1) as disk, ((ELAPSED_TIME)*power(10,-6))/(Executions+1) as Secs, buffer_gets/(fetches+0.1) as "Buf/Fetch" from gv$session a , gv$sql b where a.inst_id=b.inst_id and a.sql_id=b.sql_id and a.sql_child_number=b.child_number and status='ACTIVE' and service_name not like 'SYS%' and username not like 'SYS%' and ( BUFFER_GETS/(executions+1) > 90000 or disk_reads/(executions+1)> 5000 ) order by a.sql_id;

Query per vedere i consumi di risorse di tutte le sessioni ATTIVE

.

Con l’articolo Query per vedere i consumi di risorse,
più la durata di ogni singola esecuzione di tutte le sessioni ATTIVE,
forniamo una query per analizzare le sessioni attive.


Inoltre selezioniamo:
SID,
SQL_ID,
l’utente con cui viene aperta la sessione,
l’utente del sistema operativo e
l’evento associato alla sessione.


Infine vediamo l’utilizzo di risorse oltre al numero di esecuzione,
ossia quante volte è stata eseguita e la durata di attesa.

I campi selezionati sono:

INST_ID – Numero identificativo dell’istanza del RAC.
SID – Numero identificativo della sessione.
USERNAME – Nome utente con cui è stata eseguita la sessione.
SQL_ID – Numero identificativo dello statement.
EVENT – Evento d’attesa associato alla sessione.
EXECUTIONS – Numero totale di esecuzioni dello statement.
BUFFER_GETS – Memoria di BUFFER CHACE utilizzata da ogni singola esecuzione.
DISK_READS – Letture disco eseguite da ogni singola esecuzione.
SECOND_IN_WAIT – Tempo di attesa della sessione in secondi.

Recuperiamo le informazioni dalle tabelle
GV$SESSION e
GV$SQLAREA,
le quali sono messe in relazione dalle JOIN
a.INST_ID=b.INST_ID e
a.SQL_ID=b.SQL_ID.

Infine mostriamo le sessioni attive
di tutti gli utenti diversi da SYS e SYSTEM.

col inst_id for 9999
col sid for 99999
col LAST_LOAD_TIME for a22
col buff_gets for 99999999999
col executions for 99999999999
col sql_text for a100 wrap
set long 10000
col osuser for a10
col machine for a12
col buff_get for 99999999999
col disk for 99999999
col Secs for 999,99
col username for a12
set linesize 400
col event for a28
select a.inst_id , a.sid, a.username , a.sql_id, a.event , osuser,executions ,  BUFFER_GETS/(executions+1) as buff_get, DISK_READS/(executions+1) as disk, seconds_in_wait
 from gv$session a , gv$sqlarea b
where a.inst_id=b.inst_id and
      a.sql_id=b.sql_id and 
      status='ACTIVE' and
      service_name not like 'SYS%' and
      username not like 'SYS%' 
order by 5 ;

Query per vedere i consumi di risorse delle sessioni attive

.

Con l’articolo Query per vedere i consumi di risorse
delle sessioni attive,
abbiamo la possibilità di individuare velocemente
le sessioni attive con l’evento associato.

Inoltre è possibile individuare:
il SID,
l’SQL_ID,
l’utente di provenienza e
i consumi di risorse utilizzati.

Infine per ogni query è selezionato il numero e i tempi di esecuzione.

I campi selezionati sono:

INST_ID – Numero identificativo dell’istanza di un RAC
SID – Numero identificativo della sessione
USERNAME – Utente proprietario della sessione
SQL_ID – Numero identificativo dello statement SQL
EVENT – Risorsa o ovento per il quale la sessione è in attesa
OSUSER – Utente del sistema operativo da cui è partita la sessione
EXECUTIONS – Numero totale di esecuzioni della sessione
BUFFER_GETS – Valore di memoria di buffer cache
utilizzata da una sola esecuzione
DISK_READS – Valore di letture disco utilizzato da una sola esecuzione
ELAPSED_TIME – Tempo trascorso da ogni singola esecuzione.

Le informazioni sono recuperate dalle tabelle:
gv$session e
gv$sqlarea
le quali sono messe in relazione dalle JOIN
a.inst_id=b.inst_id e
a.sql_id=b.sql_id.

Infine le sessioni sono filtrate per
status=’ACTIVE’.

Query per vedere i consumi di risorse delle sessioni attive

col inst_id for 9999
col sid for 99999
col LAST_LOAD_TIME for a22
col buff_gets for 99999999999
col executions for 99999999999
col sql_text for a100 wrap
set long 10000
col osuser for a10
col machine for a12
col buff_get for 99999999999
col disk for 99999999999
col Secs for 999,99
col username for a16
set linesize 400
col event for a40
select a.inst_id , a.sid, a.username , a.sql_id, a.event , osuser,executions ,  BUFFER_GETS/(executions+1) as buff_get, DISK_READS/(executions+1) as disk, ((ELAPSED_TIME)*power(10,-6))/(Executions+1) as Secs
  from gv$session a , gv$sqlarea b
 where a.inst_id=b.inst_id and 
       a.sql_id=b.sql_id and 
       status='ACTIVE' and 
       username is not null
order by 5 ;

Query per vedere l’utilizzo di risorse delle SESSIONI ATTIVE

.

Con l’articolo Query per vedere l’utilizzo di risorse delle sessioni attive,
vediamo informazioni utili per individuare le sessioni
che stanno utilizzando
un eccessivo consumo di risorse.

Dalla query selezioniamo l’istanza di provenienza,
l’utente proprietario,
l’utente del sistema operativo,
la macchina e
il programma di provenienza.

Inoltre visualizziamo le informazioni relative ai consumi di risorse
della sessione attiva.

I campi selezionati sono:

INST_ID – Numero identificativo dell’istanza del RAC
SID – Numero identificativo della sessione
USERNAME – Nome utente con cui è stata eseguita la sessione
SQL_ID – Numero identificativo dello statement
PROGRAM – Software da cui proviene la sessione
MACHINE – Nome macchina da cui proviene la sessione
OSUSER – Nome dell’utente del sistema operativo
EXECUTIONS – Numero totale delle esecuzioni dello statement
BUFFER_GETS – Memoria di BUFFER CHACE utilizzata da ogni singola
DISK_READS – Letture disco eseguite da ogni singola esecuzione
ELAPSED_TIME – Tempo di esecuzione per ogni singola esecuzione

Inoltre recuperiamo le informazioni dalle tabelle
GV$SESSION e
GV$SQL.

Infine mettiamo il risultato in relazione dalle JOIN
a.INST_ID=b.INST_ID,
a.SQL_CHILD_NUMBER=b.CHILD_NUMBER
a.SQL_ID=b.SQL_ID

In aggiunta, i record sono filtrati per:
USERNAME diverso da SYS e
SESSIONI ATTIVE.

Query ACTIVE Running:

col I for 9
col sid for 9999
col LAST_LOAD_TIME for a22
col buff_gets for 99999999999
col executions for 99999999999
col sql_text for a100 wrap
set long 10000
col osuser for a8
col machine for a10
col buff_get for 9999999999
col Secs for 999,99
col username for a16
col program for a34
col sql_child for 9999
col disk for 9999999
col cpu for 99999999
col cld for 999
col cpu for 99999999
set linesize 400
select a.inst_id as I, a.sid, a.username , a.sql_id, a.program ,machine , osuser, executions, BUFFER_GETS/(executions+1) as buff_get,DISK_READS/(executions+1) as disk , ((ELAPSED_TIME)*power(10,-6))/(Executions+1) as Secs
  from gv$session a , gv$sql b
 where a.inst_id=b.inst_id and 
       a.sql_child_number=b.child_number and
       a.sql_id=b.sql_id and status='ACTIVE' and
       service_name not like 'SYS%' and
       username not like 'SYS%' 
order by 3,4 ;

Query per vedere i dettagli di un statement da SID

.

Con l’articolo Query per vedere i dettagli di un statement da SID,
forniamo una statement che permette di individuare il testo in esecuzione di una sessione attiva attraverso il SID.

Inoltre, per essere sicuri di aver individuato la corretta sessione, oltre al SID è selezionato il SERIAL della sessione.

Dettagli statement da SID:

set serveroutput on
DECLARE
 sid NUMBER;
 serial NUMBER;
 ddl CLOB;
BEGIN
 select b.sid, b.serial#, a.sql_text
INTO sid,serial,ddl
 from v$sql a, v$session b
where b.sid in (&seq_sid) and 
     (b.sql_address = a.address or 
      b.SQL_HASH_VALUE = a.hash_value);
dbms_output.put_line(ddl);
END;
/

Query per estrarre lunghi statement da un SQL_ID successivo EXPLAIN PLAIN dello statement

.

Con l’articolo Query per estrarre lunghi statement da un SQL_ID successivo EXPLAIN PLAIN dello statement forniamo una piccola procedura PL_SQL che permette di estrapolare lo statement in esecuzione di un SQL_ID.

Inoltre è presente lo script fornito da Oracle che permette di visualizzare lo statement Expleined in precedenza.

Quindi, una volta recuperato lo statement, lo ordinate, inserite l’owner proprietario davanti ai nomi delle tabelle e rieseguite lo statement con datavanati EXPLAIN PLAN.

Esempio:

EXPLAIN PLAN SELECT …. FROM …. WHERE …..;

Una volta che viene restituito il messaggio Explained, potete eseguire lo script utlxplp.sql.

set serveroutput on
DECLARE
 ddl CLOB;
BEGIN
 select a.sql_fulltext
INTO ddl 
from v$sql a
 where a.sql_id = '&sql_id' and
 rownum <2;
dbms_output.put_line(ddl);
END;
/

--Piano d'esecuzione dello statement relativo all'sql_id:

@$ORACLE_HOME/rdbms/admin/utlxplp.sql

Query per vedere se è cambiato il piano d’accesso ai dati – PLAN_HASH_VALUE

.

Con l’articolo Query per vedere se è cambiato il piano d’accesso ai dati – PLAN_HASH_VALUE,
abbiamo la possibilità di individuare il SQL_ID,
il PLAN_HASH_VALUE e
l’utilizzo di risorse macchina con i tempi e
il numero d’esecuzione di un determinato SQL_ID.

Inoltre, se vediamo che il PLAN_HASH_VALUE è cambiato e
i valori sui consumi di risorse sono notevolmente aumentati,
è possibile fissare il precedente piano d’accesso ai dati.

I campi selezionati sono:
SQL_ID – Numero identificativo dello statement SQL
PLAN_HASH_VALUE – Piano d’accesso ai dati assegnato dall’ottimizzatore di Oracle
EXECUTIONS – Numero totale di esecuzioni di uno SQL_ID
BUFFER_GETS – Numero totale di memoria utilizzata da un SQL_ID
ELAPSED_TIME – Tempo utilizzato dallo statementi in microsecondi
CPU_TIME – Tempo utilizzato dalla CPU in microsecondi
DISK_READS – Numero totale di letture disco effettuate da un SQL_ID

Inoltre le informazioni sono recuperate dalla tabella V$SQLAREA.

Infine le informazioni vengono filtrate dal SQL_ID.

Analisi consumi di un SQL_ID:

set lines 300 
col sql_id for a15
select sql_id, PLAN_HASH_VALUE, EXECUTIONS, BUFFER_GETS, ELAPSED_TIME, CPU_TIME, DISK_READS 
  from v$sqlarea 
 where sql_id='&sql_id';

Query per estrarre lo statement da SQL_ID

.

Con la seguente query è possibile estrarre lo statement in esecuzione da SQL_ID.

Il campo selezionato è SQL_TEXT della tabella V$SQLAREA.

Testo statement da sql_id:

set lines 300 
pages 999 
select sql_text from v$sqlarea where sql_id = '&sql_id';
Wordpress Social Share Plugin powered by Ultimatelysocial