Oracle Concept 的一些笔记 -- SGA

好记性不如烂笔头,虽然现在已经用电脑代替了。不过写下来有助于自身更好的学习

这部分主要将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下篇总结。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值