it-swarm.it

Come trovare le ultime istruzioni SQL nel database?

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 che richiedono più CPU/DISK.

25
Sebastian Roth

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.

17
Sebastian Roth

La console di Oracles Enterprise Monitor mostra tutta una serie di informazioni sulle query SQL che occupano la CPU massima, i colli di bottiglia, le attività principali nel database, bloccando SQL e altri.

Per un approccio storico, puoi usare i rapporti AWR di Oracle per individuare le aree che ti riguardano.

alt text

enter image description here

13
Sathyajith Bhat

Puoi anche usare V$SQL, ci sono diverse colonne interessanti RUNTIME_MEM, EXECUTIONS, DISK_READS, SORTS, ELAPSED_TIME, SQL_FULLTEXT eccetera.

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 in V$SQL_PLAN puoi ottenere un vero piano esplicativo 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 tuo statistics_level=ALL Puoi usare V$SQL_PLAN_STATISTICS.

4
gabrielp

Per SQL recente:

select * from v$sql

Per la storia:

select * from dba_hist_sqltext
2
grokster