Mettere sotto TRACE una sessione / sql - TKPROF

Rientra nelle tecnince di SQL Tuning,

E' vantaggioso perchè individua tutte le sql statements eseguite tra lo start e la fine del trace.

E' un tool free ma occorre avere le grant di dba.

Il file TKPROF contiene queste info


call     count       cpu    elapsed       disk      query    current        rows

------- ------  -------- ---------- ---------- ---------- ----------  -----------------------------------------

Parse        1      0.01       0.00          0          0          0           0

Execute      1      0.00       0.00          0          0          0           0

Fetch        6      0.38       0.38          0       8133          0          66

------- ------  -------- ---------- ---------- ---------- ----------  -----------------------------------------

total        8      0.39       0.39          0       8133          0          66


count    = number of times OCI procedure was executed

- parse time  --> se molto alto suggerisce di controllare il sistema piuttosto che la query

- execute time --> indica piuttosto il tempo di esecuzione di un update, etc che di una select di una query

- fetch time --> mostra quanti dati vengono lettti dal database.  Più è alto e più le prestaioni peggiorano.

cpu      CPU Time cioè per quanto tempo è stata utilizzata la CPU durante l'esecuzione della quey, in secondi.

elapsed  Elapsed TIME è il tempo atteso dall'utente finché il database non ha gestito il risultato per l'utente.

Se la CPU Time < Elapsed Time ===> vuol dire che ci sono molti tempi di attesa nell'esecuzion della query.

disk     = number of physical block reads from disk to buffer cache ==> più è alto e più le prestazioni peggiorano. Se disk = 0 vuol dire che legge i dati solo dalla buffer cache.

query    = number of buffers gotten for consistent read

current  = number of buffers gotten in current mode (usually for update)

rows     = number of rows processed by the fetch or execute call. E' il numero di righe restituite.


I dati sono memorizzati in blocchi e prima di essere forniti all'utente vengono memorizzati nel buffer cache. 

I blocchi nella buffer cache potrebbero combiare nel tempo con DML. Se il blocco è cambiato nel tempo, il blocco è letto nella "current mode"perché quando esegui una query da quel blocco, il blocco è messo in stato lock perchè deve essere aggiornato.
Lo stato current mode è il numero di blocchi modificati ma non ancora committati.

Se i blocchi non sono modificati, allora il database legge quei blocchi in query mode perchè non sono bloccati.

 Physical and Logica Read  fisico vuol dire che leggi i dati dal disco mentre logical che leggi dal buffer cache.

WAIT Events non comprende la CPU Time  

Misses in library cache during parse: 0  ==> vuol dire che l'execution plan già esiste nella Library Cache e pertanto si parla di Soft parse che è più veloce di un Hard parse.  Se 1 vuole vuol dire che è un hard parse.

Optimizer mode: ALL_ROWS  ==> l'optimizer usa l'opzione ALL_ROWS per generare le statistiche

Parsing user id: 108 ==>  è dell'id dell'utente ch esegue la query select user_id from dba_users where username='HR';

Number of plan statistics captured: 1 ==> individua il numero di execution plan trovate nel trace file per la query analizzata.

L'nformazione più importnate è "Misses in library cache during parse". Se ad esempio la nostra query usa Bind Variable, potrebbero vedere differenze tra la library cache misses e il count parse.


Rows (1st) Rows (avg) Rows (max)  Row Source Operation

---------- ---------- ----------  -----------------------------------------------------------------------------------------

  107        107        107  TABLE ACCESS FULL EMPLOYEES (cr=14 pr=0 pw=0 time=211 us starts=1 cost=3 size=7383 card=107)

Row Source Operation == > vuole dire che èuna execution plan e non una explain plan.

Se i valori di Rows 1st, avg e max sono diversi vuol dire che le statistiche non sono aggiornate.

cr ==> conistent read, cioè letture logiche dal buffer cache.

pr ==> physical reads 

pw ==> physical writes

time ==> è il tempo di esecuzione in microsecondi

starts ==> indica il numero di volte il comando (Table access full......) viene eseguito. Nel caso di una nested loop join, viene letta la seconda tabella per ogni riga della driving table quindi il valore di starts è maggiore di 1.

cost ==> costo dello step

size ==> numero di byte letti per questo step

card ==> cardinalità per questo step


************   1 METODO **************

Fatto su un database 19c con  pluggable SVIL01

1) Connettersi con l'utenza che deve eseguire la query

sqlplus frank/passwd@SVIL01

2) Aprire una nuova sessione e connettersi con sys al SVIL01 e intercettare la sessione avviata con la connessione precedente:

SQL > select sid,serial# , username, to_char(logon_time,'dd-mm-yyyy hh24:mi:ss'), status

from  v$session where username ='FRANK'

order by logon_time desc;

Ad esempio sid=304 e serial#=30209

3) Lanciare la query da analizzare dalla sessione collegato come frank.

4) Eseguire dalla seconda sessione come sys

SQL> exec DBMS_System.set_ev(sid, serial#, event, level, name);

SQL>   exec  DBMS_SYSTEM.set_ev(304, 30209, 10046, 12, '');


SQL> SELECT s.sid, s.serial#, p.spid

FROM v$process p, v$session s

WHERE p.addr = s.paddr

AND s.username = 'FRANK';

5) Collegarsi al server db per risalire al file di trace che è individuato dallo "spid" ricavato dalla query precedente.

SQL> show parameter  user_dump_dest

SQL> select value from v$DIAG_INFO where name = 'Diag Trace';

6) Al termine della query dalla sessione con utente sys chiudere il trace 

  SQL> exec DBMS_SYSTEM.Set_Ev(304, 30209, 10046, 0, '');


7) Convertire il trace file in un formato più leggibile per l'uomo.

Creare il report con il seguente comando:

tkprof <trace_file_nm>.trc <output_rpt_nm>.txt


Per fare questo deve essere installato il tool TKPROF.


************   2 METODO **************

SQL>  alter session set sql_trace=true;

SQL> alter session set current_schema=HR; Session altered.

SQL > alter session set tracefile_identifier=TEST;
Questo identifica il nome del file di trace SQL> select * from employees;
.......

Creare il file che permette di  identificare il trace 

107 rows selected.
SQL>  alter session set sql_trace=false;


Per vedere dove ha scritto il trace file

SQL > select * from V$DIAG_INFO where name='Diag Trace' ;

Per risalire al nome del file
SQL> SELECT s.sid,
       s.serial#,
       '*_ora_*' || p.spid || '.trc' AS trace_file
FROM   v$session s,
       v$process p
WHERE   s.username ='HR'
AND    s.paddr = p.addr;

p.spid identifica il trace file

Creare il report con il seguente comando:

tkprof <trace_file_nm>.trc <output_rpt_nm>.txt



************  3 METODO **************

  1. alter session set timed_statistics=true;
  2.  
  3. exec dbms_session.session_trace_enable(waits => true, binds => false);
  4.  
  5. select s.prod_id,p.prod_name,s.cust_id,c.cust_first_name
  6. from sh.sales s, sh.products p, sh.customers c
  7. where s.prod_id = p.prod_id
  8. and s.cust_id = c.cust_id
  9. and s.amount_sold > 1500;
  10.  
  11. exec dbms_session.session_trace_disable;

Post popolari in questo blog

Create e Drop Pluggable Database

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione