2009-06-18 18 views

risposta

39

totali cursori aperti, per sessione:

select a.value, s.username, s.sid, s.serial# 
from v$sesstat a, v$statname b, v$session s 
where a.statistic# = b.statistic# and s.sid=a.sid 
and b.name = 'opened cursors current'; 

Fonte: http://www.orafaq.com/node/758

Per quanto ne so query su V $ vista sono basati su pseudo-tabelle (tabelle "x $") che puntano direttamente alle parti rilevanti dell'SGA, quindi non puoi ottenere più accurate di così; tuttavia questo significa anche che è point-in-time (cioè lettura sporca).

+6

Questi 'cursori aperti corrente' sono pigramente raccolto dal server tabella di Oracle; quindi il numero che vedi per la tua applicazione potrebbe essere anomalo in alto senza che tu abbia commesso un errore. Vedere http://www.orafaq.com/node/758 –

8

Ecco come trovare i cursori aperti che sono stati analizzati. Devi accedere come utente con accesso a v $ open_cursor e v $ session.

COLUMN USER_NAME FORMAT A15 

SELECT s.machine, oc.user_name, oc.sql_text, count(1) 
FROM v$open_cursor oc, v$session s 
WHERE oc.sid = s.sid 
GROUP BY user_name, sql_text, machine 
HAVING COUNT(1) > 2 
ORDER BY count(1) DESC 
; 

Se fornisce una parte del testo SQL, può essere utile per identificare le applicazioni che perdono. Se un cursore non è stato analizzato, non viene visualizzato qui. Nota che Oralce a volte manterrà le cose aperte più a lungo di te.

+1

In realtà, questa è una situazione complessa. v $ open_cursor si verifica per mostrare le dichiarazioni memorizzate nella cache. Cursori aperti (la risorsa che può essere martellata se si ha un cursore/perdita ResultSet) è in v $ sessstat in una riga denominata "cursori aperti correnti". –

+1

@Ollie: Ma come ti aiuta a identificare l'istruzione SQL che perde? –

+0

Questa selezione mostra il codice SQL effettivo che ha aperto i cursori, ottimo per il debug! +1 da me –

8
select sql_text, count(*) as "OPEN CURSORS", user_name from v$open_cursor 
group by sql_text, user_name order by count(*) desc; 

sembra funzionare per me.

1

1) il tuo id dovrebbe avere accesso sys dba 2)

select sum(a.value) total_cur, avg(a.value) avg_cur, max(a.value) max_cur, 
s.username, s.machine 
from v$sesstat a, v$statname b, v$session s 
where a.statistic# = b.statistic# and s.sid=a.sid 
and b.name = 'opened cursors current' 
group by s.username, s.machine 
order by 1 desc; 
0

io uso qualcosa di simile:

select 
    user_name, 
    count(*) as "OPEN CURSORS" 
from 
    v$open_cursor 
group by 
    user_name; 
Problemi correlati