-- 查看参数值
SELECT name, value, description
FROM v$parameter
WHERE name = 'session_cached_cursors';
-- 或使用 show 命令
SHOW PARAMETER session_cached_cursors;
-- 查看所有会话的游标缓存使用情况
SELECT sid, value
FROM v$sesstat s, v$statname n
WHERE n.statistic# = s.statistic#
AND n.name = 'session cursor cache count'
ORDER BY value DESC;
推荐设置
sql-
-- 通常建议的设置
ALTER SYSTEM SET session_cached_cursors = 200 SCOPE=BOTH;
-- 对于OLTP高并发系统
ALTER SYSTEM SET session_cached_cursors = 300 SCOPE=BOTH;
-- 对于数据仓库系统(通常较低)
ALTER SYSTEM SET session_cached_cursors = 50 SCOPE=BOTH;
监控和诊断
1. 检查游标缓存命中率
sql
-- 系统级游标缓存命中率
SELECT 'session cursor cache hits' metric,
ROUND(a.value/b.value*100, 2) value
FROM v$sysstat a, v$sysstat b
WHERE a.name = 'session cursor cache hits'
AND b.name = 'parse count (total)';
-- 会话级游标缓存命中率
SELECT s.sid, s.username,
a.value "Cache Hits",
b.value "Total Parses",
ROUND(a.value/b.value*100, 2) "Cache Hit Ratio"
FROM v$sesstat a, v$sesstat b, v$statname c, v$statname d, v$session s
WHERE a.statistic# = c.statistic#
AND b.statistic# = d.statistic#
AND s.sid = a.sid
AND s.sid = b.sid
AND c.name = 'session cursor cache hits'
AND d.name = 'parse count (total)'
AND b.value > 0
ORDER BY 5 DESC;
2. 检查是否需要调整
sql
-- 检查游标缓存溢出
SELECT 'session cursor cache count' metric,
SUM(value) value
FROM v$sesstat s, v$statname n
WHERE n.statistic# = s.statistic#
AND n.name = 'session cursor cache count';
-- 检查游标缓存使用情况
SELECT sid,
s.value "Cached Cursors",
(SELECT value FROM v$parameter WHERE name = 'session_cached_cursors') "Max Cache"
FROM v$sesstat s, v$statname n
WHERE n.statistic# = s.statistic#
AND n.name = 'session cursor cache count'
AND s.value > 0
ORDER BY s.value DESC;
3. 查找高解析的SQL
sql
-- 查找硬解析最多的SQL
SELECT sql_text, parse_calls, executions,
parse_calls/executions parse_ratio,
loads, invalidations
FROM v$sql
WHERE parse_calls > 1000
AND executions > 0
ORDER BY parse_calls DESC;
-- 查找可能受益于游标缓存的SQL
SELECT sql_id, sql_text,
parse_calls, executions,
loads, invalidations
FROM v$sql
WHERE parse_calls/executions > 0.1 -- 每次执行都解析
AND executions > 100
ORDER BY parse_calls DESC;
优化建议--
何时需要增加 session_cached_cursors?
sql
-- 检查指标,如果以下条件成立,可能需要增加
SELECT
(SELECT value FROM v$sysstat WHERE name = 'parse count (hard)') hard_parses,
(SELECT value FROM v$sysstat WHERE name = 'parse count (total)') total_parses,
(SELECT value FROM v$sysstat WHERE name = 'session cursor cache hits') cache_hits,
ROUND(
(SELECT value FROM v$sysstat WHERE name = 'session cursor cache hits') /
(SELECT value FROM v$sysstat WHERE name = 'parse count (total)') * 100, 2
) cache_hit_ratio
FROM dual;
常见问题解决--
问题1:ORA-01000: maximum open cursors exceeded
sql
-- 增加 open_cursors
ALTER SYSTEM SET open_cursors = 500 SCOPE=BOTH;
-- 检查应用是否有游标泄漏
SELECT s.sid, s.username, s.program,
s.value "Open Cursors",
(SELECT value FROM v$parameter WHERE name = 'open_cursors') "Max Cursors"
FROM v$sesstat s, v$statname n
WHERE n.statistic# = s.statistic#
AND n.name = 'opened cursors current'
AND s.value > 100
ORDER BY s.value DESC;
问题2:高硬解析率
sql
-- 增加 session_cached_cursors
ALTER SYSTEM SET session_cached_cursors = 300 SCOPE=BOTH;
-- 增加 shared_pool_size
ALTER SYSTEM SET shared_pool_size = 2G SCOPE=BOTH;
-- 使用绑定变量
问题3:PGA内存压力
sql
-- 如果PGA内存紧张,可能需要降低 session_cached_cursors
-- 检查PGA使用
SELECT * FROM v$pgastat;
-- 检查每个会话的PGA使用
SELECT sid, username,
pga_used_mem/1024/1024 pga_used_mb,
pga_alloc_mem/1024/1024 pga_alloc_mb,
pga_max_mem/1024/1024 pga_max_mb
FROM v$process p, v$session s
WHERE p.addr = s.paddr
ORDER BY pga_used_mem DESC;