Come trovare le ultime istruzioni SQL all'interno del database?


Risposte:


17

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.


Solo una piccola nota: Oracle supporta (nessuna idea da quale versione) inoperatore con tuple, quindi dall'esempio sopra... AND (s.inst_id, s.sid) in ( (:id1, :sid1), (:id2, :sid2), ... )
Betlista,

1
'inst_id' sta per ID istanza, non significa id installazione.
miracle173,

13

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.

testo alternativo

inserisci qui la descrizione dell'immagine


1
Per curiosità - AWR è uno strumento disponibile per tutte le licenze Oracle e posso usarlo solo dalla riga di comando?
Sebastian Roth,

2
Mi dispiace che avrei dovuto menzionarlo - da quello che so, AWR richiede una licenza separata - Oracle Tuning & Diagnostic Pack . Preferisco usare AWR dalla console di Enterprise Manager - Sono stato benedetto con il privilegio (!) Di utilizzare la console di Enterprise Manager. Ho anche scoperto che è possibile utilizzare SQL Developer per monitorare gli SQL, ma ciò richiede la licenza di cui sopra
Sathyajith Bhat

1
Oracle Enterprise Manager (OEM) è molto carino. Siamo in grado di monitorare lo stato del nostro database quasi in tempo reale con grafici con aggiornamento automatico. Abbiamo un grande monitor appeso a una parete che mostra OEM per i nostri database primari 24x7 ed è estremamente utile per identificare i problemi che si verificano.
ScottCher,

4

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

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_PLANin quanto contiene buone informazioni. Se il tuo statistics_level=ALLè possibile utilizzare V$SQL_PLAN_STATISTICS.


2

Per SQL recente:

select * from v$sql

Per la storia:

select * from dba_hist_sqltext
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.