好记性不如烂笔头,虽然现在已经用电脑代替了。不过写下来有助于自身更好的学习
这部分主要将SGA,太长了自己看起来不爽。下面主要是抄书
1 Oracle的内存管理
主要分为 SGA, PGA 以及代码区
Oracle将运行的代码存在一个不同于用户进程内存的位置,这样就更加保证了安全性和独立性。代码区基本长度固定,只有在版本更新等情况才会变化,用户的程序(如sql/plus或者oracle form)可以被安装为代码区共享,有些程序不行。如果在同一台物理机上,多个数据库实例可以使用一个代码段。
SGA 和Oracle的每一个实例对应,实例启动则系统分配一个SGA,在实例关闭的时候回收。服务器端所有的进程以及Oracle的后台进程均可访问SGA,部分的进程有写SGA的权限。 SGA中有一部分的内存,叫做Fixed SGA,其中包含了数据库实例的状态。
SGA 包括以下几个部分
Buffer Cache
主要存放block数据的拷贝,对所有用户共享。 在这个cache中所有的block主要以两个队列的数据结构保存
Write List: 存放一些已经被修改的数据(dirty data)
LRU List: 保存三部分信息: 空block, pinned buffer(猜应该是没修改的,正处理的),dirty buffer(还没有被转移到Write List-- 这里就可以看出把buffer从LRU List到Write List的移动并不是实时的,而是有一个触发的过程1)
流程描述如下
一个DB的process试图读取一个block的内容,首先会查询buffer cache看里面是否有对应的block, 如果有则直接读取(cache hit),如果没有的话,就会在LRU List里面从LRU端开始寻找合适的空buffer,如果碰到了Dirty Buffer,则移到Write List(解释了上标1),然后继续寻找。如果找到合适的free buffer,就将block装载到buffer cache中,如果最后没有找到,就出发DBW0事件,将dirty buffer写入到磁盘中。
一般情况下buffer cahce会将新的block存放的LRU的MRU端(最新访问),但是如果是全表扫描,则会将新读入的blocks放入到LRU端(全表扫都是多个blocks一起读取,而非单block读取--参见书COB第19页)。如果想要全表扫时放到MRU端,则需在select语句中指定使用'cache'。 例如 SELECT /*+ FULL (hr_emp) CACHE(hr_emp) */ last_name FROM employees hr_emp;
Redo Log Buffer
存放一些redo的信息,这些信息可以redo语句insert/update/delete/alter/create/drop,redo buffer是由db process从用户内存中拷贝到redo log buffer,这个buffer占用了连续的空间,redo log buffer由LGWR写到redo log中。
Share Pool
主要包括Library cache,Data cache,result cache(11g新出来的)
Library cache 包括Shared SQL areas,Private SQL areas (如果是使用shared server),pl/sql的procedure和package,以及一些控制信息例如锁,最后还有library cache的handle。
Share SQL Area是针对所有用户,而Private SQL Area对每一个用户都有一个单独的copy.,在Shared SQL Area中,Oracle存储sql的分析树和执行计划,当一个新的sql被分析时,Oracle从Share SQL Area中分配一个空间,空间大小随sql的复杂度而变化,如果空间不足的话,Oracle会根据LRU算法释放原来占用的空间而分配给新的sql.
对于一些plsql程序段,oracle也是一样对待,在Share SQL Area中分析,在Private SQL Area中存储相关的变量及SQL的执行空间。在PLSQL程序段中的sql,也会分配一个独立的Share SQL Area 和Private SQL Area.
属新share sql area的几个方法
1 使用analyze 语句
2 sql中引用的对象被改变
3 database 的 global name被改变
4 alter system flush shared_pool
Dictionary Cache
主要存储一些表和视图的信息,Oracle在分析sql的时候会频繁访问这些数据。由于访问频率很高,所以在内存中有两个地方存放这些信息。一个是RowCache,另一个就是Library Cache.
Result Cache
保存查询和Package的结果,包 DBMS_RESULT_CACHE
可以用来操作这个cache,视图 V$RESULT_CACHE_*
保存了该cache中的相关信息。分为两个部分
SQL Query Result Cache
参数RESULT_CACHE_MODE 决定是否针对所有的sql使用这个cache
pl/sql function Result cache
Large Pool
可选内存块,包括
session memory for shared server 或者 Oracle XA Interface(多个数据库的事务)
IO server process
backup or restore 操作
Java Pool
Streams Pool
..没用过。
SGA就到这了,PGA下篇总结。