Mi piace ottenere le ultime dichiarazioni eseguite nel mio database, insieme agli indicatori di prestazione.
Come tale, mi piace sapere quali sono le istruzioni SQL più impegnative per CPU / DISK.
Mi piace ottenere le ultime dichiarazioni eseguite nel mio database, insieme agli indicatori di prestazione.
Come tale, mi piace sapere quali sono le istruzioni SQL più impegnative per CPU / DISK.
Risposte:
Ecco l'SQL per fare il lavoro. Aperto per il processo.
Passaggio 1: determinare gli ID di installazione e gli ID utente.
SELECT inst_id,sid FROM gv$session WHERE username='<ENTER-USERNAME>';
Passo 2:
SELECT
s.sid
,s.CLIENT_INFO
,s.MACHINE
,s.PROGRAM
,s.TYPE
,s.logon_time
,s.osuser
,sq.sorts
,sq.DISK_READS
,sq.BUFFER_GETS
,sq.ROWS_PROCESSED
,sq.SQLTYPE
,sq.SQL_TEXT
FROM gv$session s
, gv$sql sq
WHERE s.SQL_HASH_VALUE = sq.HASH_VALUE
AND s.inst_id = :inst_id -- replace with instID from above
AND s.sid = :sid -- replace with ID from above
AND sq.inst_id = s.inst_id
Potrebbero esserci più ID e ID istanza restituiti. Quindi dipende dalla scelta degli utenti su come utilizzare questi dati in un'interfaccia web ecc.
in
operatore con tuple, quindi dall'esempio sopra... AND (s.inst_id, s.sid) in ( (:id1, :sid1), (:id2, :sid2), ... )
La console di Oracles Enterprise Monitor mostra tutta una serie di informazioni su quali query SQL stanno occupando la CPU massima, i colli di bottiglia, l'attività principale nel database, bloccando SQLs et al.
Per un approccio storico, puoi utilizzare i report AWR di Oracle per individuare le aree che ti riguardano.
Puoi anche usare V$SQL
, ci sono diverse colonne interessanti RUNTIME_MEM, EXECUTIONS, DISK_READS, SORTS, ELAPSED_TIME, SQL_FULLTEXT
ecc.
Questo ti darebbe le prime 10 dichiarazioni dalla lettura del disco (nota - questo è cumulativo per tutte le esecuzioni):
select sql_id,child_number from
(
select sql_id,child_number from v$sql
order by disk_reads desc
)
where rownum<11
Se l'istruzione è ancora presente, V$SQL_PLAN
è possibile ottenere un piano esplicativo effettivo per la query:
select * from table(dbms_xplan.display_cursor('sql_id',child_number));
Mi piace anche usare V$SQL_PLAN
in quanto contiene buone informazioni. Se il tuo statistics_level=ALL
è possibile utilizzare V$SQL_PLAN_STATISTICS
.