
Oracle 19C V$SYSTEM_CURSOR_CACHE 动态性能视图详解
1 视图概述与核心作用
V$SYSTEM_CURSOR_CACHE 是 Oracle 数据库中的一个动态性能视图,它提供了关于共享池中游标缓存(Cursor Cache)的详细统计信息。游标缓存是共享池的一个重要组成部分,用于存储和管理已解析的SQL语句和PL/SQL程序的执行计划。
这个视图的主要作用是帮助DBA和性能优化专家:
- 监控游标缓存的使用效率和性能
- 诊断与游标缓存相关的性能问题
- 优化共享池和游标缓存的大小配置
- 识别游标缓存中的争用和瓶颈
2 字段详解
以下是 V$SYSTEM_CURSOR_CACHE 视图包含的字段及其详细含义:
| 字段名称 | 数据类型 | 描述 |
|---|---|---|
| KGLSTNAM | VARCHAR2(64) | 游标缓存子堆(subheap)的名称标识 |
| KGLSTGET | NUMBER | 请求从该子堆获取内存的次数 |
| KGLSTGTT | NUMBER | 成功从该子堆获取内存的次数 |
| KGLSTFLL | NUMBER | 由于内存不足导致获取失败的次数 |
| KGLSTFLS | NUMBER | 由于其他原因导致获取失败的次数 |
| KGLSTMRT | NUMBER | 从该子堆释放的内存总量(字节) |
| KGLSTALC | NUMBER | 从该子堆分配的内存总量(字节) |
| KGLSTUSD | NUMBER | 该子堆当前已使用的内存量(字节) |
| KGLSTFRE | NUMBER | 该子堆当前空闲的内存总量(字节) |
| KGLSTHON | NUMBER | 该子堆中当前被钉住(pinned)的对象数量 |
| KGLSTCAS | NUMBER | 该子堆中当前被缓存的对象数量 |
| KGLSTALO | NUMBER | 该子堆的内存分配操作次数 |
| KGLSTFRO | NUMBER | 该子堆的内存释放操作次数 |
| KGLSTSCH | NUMBER | 该子堆的调度次数 |
| KGLSTSCM | NUMBER | 该子堆的成功调度次数 |
| KGLSTSCF | NUMBER | 该子堆的调度失败次数 |
| KGLSTSCW | NUMBER | 该子堆的调度等待次数 |
| KGLSTDSZ | NUMBER | 该子堆的默认块大小 |
| KGLSTMSZ | NUMBER | 该子堆的最大块大小 |
| KGLSTCNV | NUMBER | 该子堆的转换操作次数 |
| KGLSTCNF | NUMBER | 该子堆的转换失败次数 |
| KGLSTEXC | NUMBER | 该子堆的异常情况次数 |
| CON_ID | NUMBER | 容器ID(在多租户环境中) |
3 底层原理与相关对象
3.1 底层原理
V$SYSTEM_CURSOR_CACHE 视图基于Oracle的内部内存结构,主要涉及共享池中的游标缓存管理:
-
游标缓存结构:
- 游标缓存是共享池的一部分,使用多个子堆(subheaps)来管理不同大小的游标
- 每个子堆专门处理特定大小的游标请求,提高内存分配效率
- 采用LRU(最近最少使用)算法管理缓存中的游标
-
内存管理机制:
- 当需要新的游标时,Oracle尝试从合适的子堆分配内存
- 如果子堆中没有足够空间,会尝试清理LRU列表中的旧游标
- 如果仍然无法分配,可能会抛出ORA-04031错误
-
统计信息收集:
- Oracle实时跟踪每个子堆的内存分配、释放、成功和失败情况
- 这些统计信息存储在SGA的内存结构中,通过
V$SYSTEM_CURSOR_CACHE视图暴露
3.2 相关视图
| 视图名称 | 描述 |
|---|---|
| V$SGASTAT | 提供SGA各组件的统计信息,包括游标缓存 |
| V$LIBRARYCACHE | 显示库缓存统计信息,与游标缓存密切相关 |
| V$SQLAREA | 提供共享SQL区域的统计信息 |
| V$SQL | 显示共享池中SQL语句的详细信息 |
| V$SESSION | 提供会话信息,可用于关联游标使用情况 |
3.3 基表
V$SYSTEM_CURSOR_CACHE 是基于Oracle内部的X$表构建的,主要是:
- X$KGLST:存储游标缓存子堆的统计信息
这些X$表是Oracle内部的内存结构,不建议直接查询。
4 主要使用场景
-
诊断游标缓存性能问题:
- 当遇到ORA-04031错误或游标相关的性能问题时,使用此视图分析问题根源
- 识别哪些子堆存在高失败率或争用
-
优化共享池配置:
- 根据游标缓存的使用模式调整共享池大小
- 确定是否需要增加或减少游标缓存的空间
-
监控应用程序行为:
- 分析应用程序的游标使用模式
- 识别可能导致游标缓存问题的SQL模式
-
容量规划和性能调优:
- 预测未来的游标缓存需求
- 优化应用程序以减少游标缓存争用
5 常用SQL查询示例
5.1 查看游标缓存总体使用情况
SELECT kglstnam AS "Subheap Name",
kglstget AS "Total Gets",
kglstgtt AS "Successful Gets",
kglstfll AS "Failures (No Memory)",
kglstfls AS "Failures (Other)",
ROUND(kglstget / DECODE(kglstgtt, 0, 1, kglstgtt), 2) AS "Get Success Ratio"
FROM v$system_cursor_cache
ORDER BY kglstget DESC;
5.2 分析游标缓存内存使用
SELECT kglstnam AS "Subheap Name",
ROUND(kglstalc/1024, 2) AS "Total Allocated (KB)",
ROUND(kglstusd/1024, 2) AS "Currently Used (KB)",
ROUND(kglstfre/1024, 2) AS "Currently Free (KB)",
ROUND((kglstusd / DECODE(kglstalc, 0, 1, kglstalc)) * 100, 2) AS "Usage Percentage"
FROM v$system_cursor_cache
ORDER BY kglstalc DESC;
5.3 识别高失败率的子堆
SELECT kglstnam AS "Subheap Name",
kglstget AS "Total Gets",
kglstfll AS "Memory Failures",
kglstfls AS "Other Failures",
ROUND((kglstfll + kglstfls) / DECODE(kglstget, 0, 1, kglstget) * 100, 2) AS "Failure Rate (%)"
FROM v$system_cursor_cache
WHERE (kglstfll + kglstfls) > 0
ORDER BY "Failure Rate (%)" DESC;
5.4 监控游标缓存活动
SELECT kglstnam AS "Subheap Name",
kglsthon AS "Pinned Objects",
kglstcas AS "Cached Objects",
kglstalo AS "Allocation Operations",
kglstfro AS "Free Operations"
FROM v$system_cursor_cache
ORDER BY kglstalo DESC;
6 重要知识点与原理延伸
6.1 游标缓存工作原理
-
子堆分类:
- Oracle将游标缓存分为多个子堆,每个子堆处理特定大小的游标
- 这种设计提高了内存分配效率和减少碎片
-
内存分配过程:
- 当需要新游标时,Oracle确定所需内存大小并选择合适子堆
- 如果子堆中有足够空间,直接分配
- 如果空间不足,尝试清理LRU列表中的未使用游标
- 如果清理后仍不足,分配失败
-
游标状态管理:
- 已钉住(Pinned):当前正在使用的游标
- 已缓存(Cached):在内存中但未使用的游标
- 可释放(Freeable):可以被移出内存的游标
6.2 性能优化建议
-
减少游标缓存争用:
- 使用绑定变量减少硬解析和游标数量
- 优化SQL语句,避免不必要的游标操作
- 适当增加共享池大小
-
监控关键指标:
- 关注获取失败率高的子堆
- 监控游标缓存的内存使用趋势
- 跟踪游标钉住和释放的模式
-
故障处理:
- 如果遇到ORA-04031错误,分析是哪个子堆的问题
- 考虑增加共享池或调整应用程序行为
6.3 多租户环境考虑
在多租户环境中,V$SYSTEM_CURSOR_CACHE视图包含CON_ID字段,可以用于:
- 区分不同PDB的游标缓存使用情况
- 识别特定PDB的游标缓存问题
- 为每个PDB分配适当的共享池资源
7 总结
V$SYSTEM_CURSOR_CACHE视图是Oracle数据库性能调优的重要工具,特别适用于诊断和解决与游标缓存相关的性能问题。通过监控和分析该视图提供的信息,DBA可以:
- 了解游标缓存的使用模式和效率
- 识别潜在的性能瓶颈和争用点
- 优化共享池和游标缓存的配置
- 预防和解决ORA-04031等内存相关错误
正确使用这个视图需要结合对Oracle共享池和游标管理机制的深入理解,以及对应用程序行为的分析。
欢迎关注我的公众号《IT小Chen》
1276

被折叠的 条评论
为什么被折叠?



