每一个 Oracle 的初学者在入门阶段都会接触到 SGA/PGA 的知识,如果是从 10g 开始学习那么会多或少会对
ASMM 有所了解,从使用的角度来说 ASMM 的出现极大地简化了 Oracle 内存初始化参数的设置,在 ASMM 的使
用上高级 DBA 和初学者不会有太大的差别;很多人因此而认为 ASMM 极大程度地减少了数据库对于专业 DBA 的
依赖:如果我们有一个足够智能的 DB,那么为什么还要花费金钱雇佣 DBA 呢?这似乎是时下一种十分流行的想
法。当然这种想法我个人是不能苟同的,ASMM 一定程度上带来了便利,更大程度上它是一个黑盒,黑盒里面藏
了很多秘密,这些秘密带来比手动管理更多的不确定性;在 10g release 1 和 10.2 的早期版本中 ASMM 扮演的角
色有点像一个闯祸精,另一个让用户对 ASMM 很不待见的原因是 ASMM 直接拖慢了 startup 的速度。一个个人观
点是 ASMM 也好 AMM 也罢,都要求产品数据库 DBA 掌握更多 SGA/PGA ” ” ”相关的知识才能成功 驾驭 这些 有智
”力 的家伙,有点夸张的说这个时候的 DBA 很像一个 chemist(需要和一大堆以 1 个或 2 个下划线开头的奇怪参数
打交道)。
为了不辱使命我们真的有必要了解一下 ASMM ……的基本知识,显然这并不是一件容易的事情
Oracle 的 SGA 基本内存组件从 9i 开始并没有非常大的变化,他们包括:
• Buffer Cache 我们常说的数据库高速缓存,虽然我一直不明白要冠以高速之名
• Default Pool 默认的缓冲池,大小由 DB_CACHE_SIZE 决定
• Keep Pool 持久的缓冲池,大小由 DB_KEEP_CACHE_SIZE 决定
• Non standard pool 非标准块标准池,大小由 DB_nK_cache_size 决定
• Recycle pool 回收池,大小由 db_recycle_cache_size 决定
• Shared Pool 共享池,大小由 shared_pool_size 决定
• Library cache 俗称的库缓存
• Row cache 行缓存,也叫字典缓存
• Java Pool java 池,大小由 Java_pool_size 决定
• Large Pool 大池,大小由 Large_pool_size 决定
• Fixed SGA 固定的 SGA 区域,包含了 Oracle 内部的数据结构,一般被存放在第一个 granule 中
在 9i 中尚未引入 ASMM,唯一的选择是手动管理的 SGA,有时候也叫做 MSMM。在 9i 中除去 buffer cache 的大
小可以手动修改外,其余组件都无法动态修改。因为缺乏一种动态管理的机制,所以在 9i 中如果有某个内存区域
有急用,也无法从其他有空闲内存的组件中捐献一些来解燃眉之急。
手动管理 SGA 的缺点在于:
• 个别组件如 shared pool、default buffer pool 的大小存在最优值,但组件之间无法交换内存
• 在 9i 中就提供了多种内存建议(advisor),但都要求人工手动干预
• 无法适应工作负载存在变化的环境