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.