生產環境出現效能抖動或鎖定等待時,DBA 需要「當下」看到前端應用程式正在發送什麼 SQL。Oracle 提供 V$OPEN_CURSOR 與 V$SESSION 動態效能視圖,可即時關聯活躍會話與其開啟的游標 SQL 文本。
C:\ORANTV$SESSION 篩選 狀態 = 'ACTIVE' 的會話 (SID, SERIAL#)V$OPEN_CURSOR 取得該會話正開啟的游標 SQL 文本
SELECT user_name, sql_text
FROM v$open_cursor
WHERE sid IN (
SELECT sid
FROM v$session
WHERE status = 'ACTIVE'
);
| 欄位 | 型別 | 說明 |
|---|---|---|
| SADDR | RAW(4) | 會話位址 |
| SID | NUMBER | 會話識別碼(關鍵聯結鍵) |
| USER_NAME | VARCHAR2(30) | 資料庫用戶名 |
| ADDRESS | RAW(4) | SQL 陳述式位址 |
| HASH_VALUE | NUMBER | SQL 雜湊值(可關聯 V$SQLAREA) |
| SQL_TEXT | VARCHAR2(60) | SQL 文本前 60 字元 |
V$OPEN_CURSOR.SQL_TEXT 僅顯示前 60 字元。若需完整文本,需關聯 V$SQLTEXT_WITH_NEWLINES:
SELECT s.sid, s.serial#, s.username, s.status, t.sql_text
FROM v$session s
JOIN v$sqltext_with_newlines t
ON t.hash_value = s.sql_hash_value
AND t.address = s.sql_address
WHERE s.status = 'ACTIVE'
ORDER BY t.address, t.piece;
V$LOCK、V$SESSION_WAIT 找出持有鎖的 SQLALTER SYSTEM KILL SESSION 'sid,serial#'執行查詢需具備 SELECT ANY DICTIONARY 或 SELECT_CATALOG_ROLE 權限。生產環境建議建立專用監控帳號,僅授予必要視圖查詢權限。
V$OPEN_CURSOR 反映「已開啟但未關閉」的游標,包含已執行完成待提交/回滾、或正在擷取資料的游標STATUS = 'ACTIVE' 表示會話正在執行呼叫(SQL 執行中、網路傳輸中、PL/SQL 執行中),非交易狀態掌握 V$SESSION + V$OPEN_CURSOR (+ V$SQLTEXT) 聯查技巧,是 DBA 即時診斷生產環境異常的「聽診器」。將此查詢封裝為監控腳本或納入自訂儀表板,可大幅縮短故障定位時間。