2012-04-27 12 views
5

Ho una query in esecuzione in Oracle, che può o non può essere bloccata. È in corso da circa 10 ore ora, ma in base alla quantità di dati che sto caricando potrebbe non essere irragionevole.

Stavo guardando la sessione in sessione $ gv e mi chiedevo se c'era un modo per tradurre queste informazioni per vedere se c'è effettivamente qualche attività in corso, o se la query è bloccata in attesa di un blocco o altrimenti bloccato.

Ho già letto la documentazione per questa vista here. Sono principalmente alla ricerca di suggerimenti da chiunque abbia avuto esperienza nel debug di questi tipi di problemi in Oracle.

Grazie!

+1

C'è una voce in 'v $ session_longops' che si potrebbe verificare per vedere se è progredendo? In alternativa, controlla questo link per vedere se la tua sessione è bloccata: http://www.orafaq.com/node/854 – Ollie

+0

Grazie, posso combinarlo con gv $ sqlarea per vedere quali dichiarazioni mi stanno trattenendo! – Paul

risposta

7

Nel gv$session, colonna event ti dice che cosa aspettare evento la sessione è attualmente in attesa su. Se la tua sessione è in attesa di qualche tipo di blocco tenuto da un'altra sessione, lo event ti dirà che (ad esempio, sarà "enq: TX - contesa del blocco riga" se sei in coda in attesa di bloccare una riga trattenuta da un'altra sessione) e blocking_instance e blocking_session verranno popolati con l'istanza e l'ID di sessione del titolare del blocco. È anche possibile guardare a seconds_in_wait (se wait_time=0) per determinare quanti secondi la sessione ha trascorso nell'attuale evento di attesa. Questo dovrebbe almeno dirti se la tua sessione è attualmente "bloccata", ma non ti dice se la tua query sarà mai veramente finita-- se c'è un piano sbagliato, è del tutto possibile che tu abbia "buono" attendi eventi come aspetta l'I/O del disco che indica che la sessione sta facendo qualcosa ma che la query non finirà mai davvero.

+0

Grande informazione Grazie – Paul

+1

seleziona 'ALTER SYSTEM KILL SESSION' '' || sid || ',' || "SERIAL #" || '' ';', evento da gv $ session dove machine = 'your machine' è utile per generare i comandi per eliminarli. Basta copiare la colonna incolla 1 – JDPeckham

3

Sulla base di ulteriori ricerche e commentare di Ollie sono arrivato fino a queste query che aiutano a eseguire il debug del problema:

select s.sid, 
     s.username, 
     s.machine, 
     s.osuser, 
     cpu_time, 
     (elapsed_time/1000000)/60 as minutes, 
     sql_text 
from gv$sqlarea a, gv$session s 
where s.sql_id = a.sql_id 
and s.machine like '####'; 


select lo.*, 
     a.sql_text 
from gv$sqlarea a, gv$session_longops lo 
where lo.sql_id = a.sql_id 
and lo.sid = #### 
order by lo.start_time; 
+1

Senza controllare le colonne esatte in quelle viste, non sarebbe meglio collegare gv $ sqlarea a gv $ session_longops tramite SQL_ID? Al momento non sono davanti al mio PC quindi non posso controllare :-( – Ollie

+2

Funziona anche io Ho aggiornato la risposta – Paul

0

Questo sarà utile verificare i sessione in esecuzione corrente

select a.SID, a.SERIAL#, c.OBJECT_NAME 
from v$session a, v$locked_object b, user_objects c 
where a.SID=b.SESSION_ID and b.OBJECT_ID=c.OBJECT_ID 
Problemi correlati