限制 **單一 Session 同時開啟的游標數量**,防止應用程式游標洩漏耗盡 Shared Pool / PGA,導致 `ORA-01000: maximum open cursors exceeded`。預設值 300 (11g+) / 50 (舊版),生產環境常需調大至 1000-3000。
SQL> SHOW PARAMETER open_cursors;
NAME TYPE VALUE
------------------- ------ -----
open_cursors integer 300
-- 全庫總開啟游標數
SELECT COUNT(*) FROM v$open_cursor;
-- 按 Session 統計 TOP 10
SELECT sid, COUNT(*) AS open_cursors
FROM v$open_cursor
GROUP BY sid
ORDER BY 2 DESC
FETCH FIRST 10 ROWS ONLY;
-- 按 SQL 統計最佔用游標的語句
SELECT sql_id, COUNT(*) AS cnt
FROM v$open_cursor
GROUP BY sql_id
ORDER BY 2 DESC
FETCH FIRST 10 ROWS ONLY;
-- 同時生效於 SPFILE (持久化) 與 記憶體 (即時)
ALTER SYSTEM SET open_cursors = 2000 SCOPE = BOTH;
-- 僅記憶體生效 (重啟失效),測試用
ALTER SYSTEM SET open_cursors = 2000 SCOPE = MEMORY;
-- 僅 SPFILE 生效 (下次啟動生效)
ALTER SYSTEM SET open_cursors = 2000 SCOPE = SPFILE;
驗證:`SHOW PARAMETER open_cursors;` → VALUE 應為 2000。
| 場景 | 建議值 | 理由 |
|---|---|---|
| 一般 OLTP | 500-1000 | 足夠應對連接池複用、預備語句緩存 |
| 高併發 / 批次處理 / 多游標框架 | 2000-5000 | 防止突發洩漏觸頂,預留緩衝 |
| 長期穩定無報錯 | 維持預設或微調 | 避免無謂佔用 PGA/Shared Pool |