V$SGA_DYNAMIC_COMPONENTS是唯一能实时反映SGA组件内存频繁伸缩抖动的视图,重点关注OPER_COUNT、LAST_OPER_TIME、LAST_OPER_TYPE、CURRENT_SIZE与MIN_SIZE关系,并结合AWR中“SGA Resize Operations”小节及V$SGAINFO的Granule Size验证对齐性。
查 V$SGA_DYNAMIC_COMPONENTS 看组件是否频繁伸缩
内存抖动最直接的表现就是 sga 组件大小反复变化,v$sga_dynamic_components 是唯一能实时反映这一行为的视图。重点关注 oper_count 和 last_oper_time 字段:
-
OPER_COUNT > 50且集中在最近 1 小时内,说明 ASMM 正在高频干预,不是稳态而是挣扎态 -
LAST_OPER_TYPE = 'SHRINK'频繁出现,尤其伴随LAST_OPER_MODE = 'AUTO',大概率是某组件内存被持续挤占(常见于 shared pool 被 buffer cache 反向挤压) -
CURRENT_SIZE与MIN_SIZE接近,但MAX_SIZE显著更大,说明 Oracle 想扩却受阻——可能是 SGA_TARGET 已到顶,或 granule 分配失败
结合 AWR 报告里的 “SGA Resize Operations” 找触发源头
AWR 报告中 “Instance Activity Stats” 后面的 “SGA Resize Operations” 小节,会列出每次 resize 的时间、组件名、操作类型和耗时。这不是简单汇总,而是抖动归因的关键证据:
- 若某次
shared poolSHRINK后紧接着DEFAULT buffer cacheGROW,且间隔 - 如果 resize 操作集中出现在每小时整点(如 10:00、11:00),要检查是否有定时 job(如统计信息收集、大报表)触发了瞬时高解析/高缓存需求
- 注意
Duration (ms)列:单次 > 500ms 的 resize 往往伴随 latch 等待上升,说明调整过程本身已成瓶颈
用 V$SGAINFO 验证 Granule 对齐与内存碎片
Oracle SGA 内存按 granule(粒度)分配,典型值为 4MB 或 16MB。不匹配 granule 的配置会导致隐式截断或浪费,加剧抖动:
- 查
V$SGAINFO中Granule Size值,再核对V$SGA_DYNAMIC_COMPONENTS里各CURRENT_SIZE是否为其整数倍——不是,则实际生效大小已被向下取整,剩余空间闲置 -
Free SGA Memory Available行显示非零但很小(如 CURRENT_SIZE 总和远小于SGA_TARGET,说明 granule 碎片化严重,ASMM 无法凑出足够连续块来满足增长请求 - 此时即使
SGA_TARGET看似充裕,也会频繁报ORA-04031或触发 SHRINK,本质是“有内存,但分不开”
对比 AWR 中 “Buffer Pool Advisory” 和 “Shared Pool Advisory” 的建议冲突
AWR 的两个 advisory 模块常给出矛盾建议,这是抖动的重要诱因:
- Buffer Pool Advisory 建议把
DB_CACHE_SIZE提到 24GB,Shared Pool Advisory 却提示SHARED_POOL_SIZE至少需 8GB——但当前SGA_TARGET = 30GB,两者相加已超限,ASMM 必须二选一牺牲 - 这种冲突在混合负载(OLTP + 报表)系统中最明显:buffer cache 缓解物理读,shared pool 缓解硬解析,但 Oracle 不知道你更怕哪种等待
- 不要盲从任一 advisory,应查 AWR 中 “Top 5 Timed Foreground Events”:若
latch: library cache或cursor: pin S wait on X排前三,优先保 shared pool;若db file sequential read主导,则 buffer cache 更关键
抖动从来不是单一参数问题,而是 ASMM 在多个约束(granule、SGA_TARGET、组件 min/max、负载特征)间强行平衡的结果。真正要盯的不是“当前多大”,而是“为什么刚调完就又得调”。











