2009-06-18 19 views

Odpowiedz

39

Wszystkich kursory otwarty przez sesji:

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'; 

Źródło: http://www.orafaq.com/node/758

O ile wiem, zapytań na V $ poglądów są oparte na pseudo-tabel (tabele "x $"), które wskazują bezpośrednio odpowiednie części SGA, więc nie można uzyskać dokładniejszych informacji; oznacza to jednak, że jest to punkt-w-czasie (tj. "brudny odczyt").

+6

Te 'otwarte kursory prąd' są leniwie reaped przez serwer tabeli Oracle; więc liczba, którą widzisz dla twojego zgłoszenia może być nienormalnie wysoka, bez znaczenia, że ​​popełniłeś błąd. Zobacz http://www.orafaq.com/node/758 –

8

Oto jak znaleźć otwarte kursory, które zostały przeanalizowane. Musisz być zalogowany jako użytkownik z dostępem do v $ open_cursor i 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 
; 

Jeśli podaje część tekstu SQL, może być przydatna do identyfikowania nieszczelnych aplikacji. Jeśli kursor nie został przeanalizowany, nie pojawia się tutaj. Zauważ, że Oralce czasami będzie otwierać rzeczy dłużej niż Ty.

+1

W rzeczywistości jest to złożona sytuacja. v $ open_cursor zdarza się wyświetlać instrukcje w pamięci podręcznej. Otwarte kursory (zasób, który można wbić, jeśli masz kursor/wyciek ResultSet) znajduje się w v $ sessstat w wierszu o nazwie "otwarty kursor prądu". –

+1

@Ollie: Ale w jaki sposób pomaga to w identyfikacji wycieku instrukcji SQL? –

+0

Ten wybór pokazuje rzeczywisty kod SQL, który otworzył kursory, idealne do debugowania! +1 ode mnie –

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

wydaje się działać dla mnie.

1

1) Identyfikator powinien mieć dostęp 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

używam coś takiego:

select 
    user_name, 
    count(*) as "OPEN CURSORS" 
from 
    v$open_cursor 
group by 
    user_name; 
Powiązane problemy