过着简单,真实的生活,喜欢收藏变形金刚(TFE,G1,SL系列),研究金融股市,KOF98,篮球,学习研究Oracle技术,我并不是一个全职的Oracle DBA,但是对于Oracle技术的热爱和研究,是一个不争的事实,愿意结交广大Oracle技术爱好者!MSN:oracle_kof_tf@hotmail.com

Library Cache

上一篇 / 下一篇  2008-04-24 18:05:40 / 个人分类:Oracle数据库技术-内存管理

Library Cache主要包括SQL共享区以及PL/SQL的程序单元。

        为了简单起见先从共享SQL区说起,共享SQL区顾名思义就是共享runtime sql的区域,其中存储了SQL语句的解析树和执行计划,一条sql语句在oracle内存中执行的时候首先要分别在shared pool中的共享SQL区和PGA中的私有SQL区中各有一份copy.也就是说一个用户执行一条sql语句的时候,PGA和shared SQL area都各有一份copy.那么如果有多个并发用户来同时执行共享SQL区中的SQL语时,Oracle会选择重新组织共享SQL区,使得这些用户可以重用共享SQl区,但是这些用户同时在他们各自的PGA内存中的私有SQL区中保留各自的一份SQL拷贝。同buffer cache一样,shared pool也是按照LRU的原则进行管理的,当一条新的SQL语句被解析的时候,oracle会在shared pool中给library cache中的共享SQL区分配一块内存,那么这个内存的大小和SQL语句的复杂度有很大的关系。如果shared pool在分配共享SQL区时出现空间不够的情况,这个时候依据LRU的算法,Oracle会释放shared pool中最近最少使用的内存块。那么假如Oracle释放的是一个共享SQL区的内存,那么相应的SQL语句在下次执行的时候就必须再一次解析并的重新分配空间,从解析SQL到为共享SQL区分配空间是一个比较消耗CPU的工程,所以在书写SQL语句的时候一般提倡使用band var.如果不使用bind var,即使一个SQL语句中的变量不同,Oracle也视为一个新的SQL语句,那么就会重复上面所说的解析和内存分配的动作,会大大消耗系统资源,降低系统的性能。
      Oracle对于PL/SQL程序单元(存储过程、函数、包、匿名PL/SQL块和触发器)的处理过程和对单个的SQL语句的处理过程相似。它会在shared pool中分配一个共享区来存储被解析、编译过的程序单元。同时在PGA中分配一个私有区域来存放运行程序单元的会话所指定的程序单元的参数值(包括本地变量、全局变量和包变量)和用于执行程序所需的内存。如果多个用户运行同一个程序单元,则他们在shared pool中共享同一个共享区域,并且各自在PGA中保持一份私有区域,用于用户会话中指定的变量值。
另外注意:一个PL/SQL程序单元中的每条单个SQL语句的处理过程则和上面描述的SQL语句的处理过程相同。要注意一点,尽管这些语句是从PL/SQL程序单元中来的,但是Oracle还是会为这些语句分配一块共享SQL区,同时为每个用户分配一个相应的私有SQL区。

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar