Truy vấn để tìm số không là gì. của các con trỏ mở hiện tại trong một Oracle Instance?Cách tìm con trỏ đang mở hiện tại trong Oracle
Ngoài ra, tần suất chính xác/cập nhật của dữ liệu này là bao nhiêu?
Tôi đang sử dụng Oracle 10gR2
Truy vấn để tìm số không là gì. của các con trỏ mở hiện tại trong một Oracle Instance?Cách tìm con trỏ đang mở hiện tại trong Oracle
Ngoài ra, tần suất chính xác/cập nhật của dữ liệu này là bao nhiêu?
Tôi đang sử dụng Oracle 10gR2
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).
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.
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'. –
@Ollie: Nhưng nó giúp bạn xác định câu lệnh SQL bị rò rỉ như thế nào? –
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 –
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) 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;
Oracle có một trang cho vấn đề này với các đề xuất SQL và xử lý sự cố.
"Gỡ rối mở vấn đề Cursor" http://docs.oracle.com/cd/E40329_01/admin.1112/e27149/cursor.htm#OMADM5352
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;
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 –