2009-06-18 43 views

Trả lời

39

Tổng số con trỏ mở, bởi phiên:

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

Nguồn: http://www.orafaq.com/node/758

Theo như tôi biết các truy vấn trên $ lần xem v được dựa trên giả bảng ("x $" bảng) trỏ trực tiếp đến các phần có liên quan của SGA, vì vậy bạn không thể chính xác hơn điều đó; tuy nhiên điều này cũng có nghĩa là nó là thời điểm (ví dụ: đọc bẩn).

+6

Những 'con trỏ mở hiện' đang uể oải gặt hái được bởi các máy chủ bảng Oracle; do đó số lượng bạn thấy cho ứng dụng của mình có thể cao bất thường mà không có nghĩa là bạn đã mắc lỗi. Xem http://www.orafaq.com/node/758 –

8

Dưới đây là cách tìm các con trỏ mở đã được phân tích cú pháp. Bạn cần đăng nhập với tư cách người dùng có quyền truy cập v $ open_cursor và 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 
; 

Nếu cung cấp cho bạn một phần của văn bản SQL để có thể hữu ích cho việc xác định ứng dụng bị rò rỉ. Nếu con trỏ chưa được phân tích cú pháp, thì con trỏ sẽ không xuất hiện ở đây. Lưu ý rằng Oralce đôi khi sẽ giữ cho mọi thứ mở lâu hơn bạn.

+1

Thực ra, đây là một tình huống phức tạp. v $ open_cursor xảy ra để hiển thị các câu lệnh được lưu trong bộ nhớ cache. Mở con trỏ (tài nguyên có thể được đóng búa nếu bạn có một con trỏ/ResultSet rò rỉ) là trong v $ sessstat trong một hàng có tên là 'mở con trỏ hiện tại'. –

+1

@Ollie: Nhưng nó giúp bạn xác định câu lệnh SQL bị rò rỉ như thế nào? –

+0

Lựa chọn này cho bạn thấy mã SQL thực tế đã mở con trỏ, rất tuyệt để gỡ lỗi! +1 từ tôi –

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

có vẻ phù hợp với tôi.

1

1) id của bạn nên có quyền truy cậ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

tôi sử dụng một cái gì đó như thế này:

select 
    user_name, 
    count(*) as "OPEN CURSORS" 
from 
    v$open_cursor 
group by 
    user_name; 
Các vấn đề liên quan