sga配置过小的直接证据是v$sga_dynamic_components中oper_count>50且last_oper_time在近1小时内、current_size长期接近min_size、last_oper_type='shrink'频繁出现,表明asmm已失能而非稳态。

SGA 配置过小的直接证据不是“free memory 少”,而是 V$SGA_DYNAMIC_COMPONENTS 中频繁 SHRINK、CURRENT_SIZE 长期卡在 MIN_SIZE 附近,且 OPER_COUNT 在一小时内突增超 50 次——这时 AWR 报告里任何 advisory 建议都只是表象,真实问题是 ASMM 已经失能。
看 V$SGA_DYNAMIC_COMPONENTS 是否在高频挣扎
这个视图比 AWR 报告里的 “SGA Resize Operations” 更实时、更敏感,是判断 SGA 是否被压垮的第一道关卡:
-
OPER_COUNT > 50且LAST_OPER_TIME落在最近 60 分钟内 → Oracle 正反复尝试调整,不是稳态,是内存分配逻辑被卡住 -
CURRENT_SIZE接近MIN_SIZE但远小于MAX_SIZE→ 想扩,但扩不出去;常见于SGA_TARGET已到顶,或Granule Size碎片化导致无法凑出连续块 -
LAST_OPER_TYPE = 'SHRINK'频繁出现(尤其component = 'shared pool')→ 不是 shared pool 太小,而是 buffer cache 或其他组件在反向挤压它 -
OPER_MODE = 'MANUAL'的组件存在 → 它被锁死,弹性压力全甩给其他组件,极易诱发连锁收缩
查 AWR 中 “SGA Resize Operations” 小节是否密集触发
这不是摘要,是 ASMM 实际执行过的 resize 流水账,能定位抖动源头:
- 若
shared poolSHRINK后 5 秒内DEFAULT buffer cacheGROW→ 大概率是硬解析风暴触发的内存重分配,不是配置问题 - 操作集中在整点(如 10:00、11:00)→ 很可能是统计信息收集、报表生成等定时 job 引发瞬时压力,该调 job 或 SQL,不是无脑扩 SGA
-
Duration (ms)列单次 > 500 → resize 过程本身已成瓶颈,伴随latch: shared pool或library cache lock上升,此时扩内存只会加重争用
核对 V$SGAINFO 是否存在 granule 对齐失败
Oracle 按 granule(典型 4MB 或 16MB)分配 SGA 内存。不匹配 granule 的配置会导致隐式截断,造成“看着够、实际分不开”:
- 查
V$SGAINFO中Granule Size值,再检查V$SGA_DYNAMIC_COMPONENTS里各CURRENT_SIZE是否为其整数倍 —— 不是,说明实际生效大小已被向下取整,剩余空间闲置 -
V$SGA_DYNAMIC_COMPONENTS中所有CURRENT_SIZE总和远小于SGA_TARGET,但V$SGASTAT显示free memory极低(如 - 此时即使
SGA_TARGET看似充裕,也会频繁报ORA-04031或触发SHRINK,不是缺内存,是“分不开”
真正难的不是算出该配多大,而是确认 SGA_TARGET 是否真能落地:哪怕 V$SGAINFO 显示 granule 是 4MB,只要 V$SGA_DYNAMIC_COMPONENTS 里任意一个 CURRENT_SIZE 除不尽 4MB,就说明这部分内存实际没按预期对齐——这种细节,在 AWR 报告里根本看不到。











