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 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的混杂度而改变,万一空间不足www.d1am.com的话,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。
关于Oracle数据库SGA的知识的总结就介绍这么多,希望能够带给您一些收获吧。
【编辑推荐】