Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2796392
  • 博文数量: 389
  • 博客积分: 4177
  • 博客等级: 上校
  • 技术积分: 4773
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-16 23:29
文章分类

全部博文(389)

分类: Oracle

2010-12-07 01:33:48

                   7 oracle memory archtrecture
      分配给ORACLE的内存主要以下作用:存储程序代码,连接ORACE会话的信息,用来进行进程间通信的信息,数据的CACHE.
      ORACLE的内存主要可以分为两类:SGA和PGA;
      SGA是一组存储块和控制信息的共享内存,被所有前台和后台进程所共享.每一个INSTANCE都有一个对应的SGA,在LINUX中可以通过SID进行HASH,来唯一地区分每个INSTANCE的SGA.SGA可以被每个进程进行读写,主要组成有:db cache,log buffer,shared pool,java pool,streams pool,large pool.SGA中还有一部分称为FIXED SGA主要用来存储DB本身的状态信息和一些变量,这个区域只能是读的.
      SGA_MAX_SIZE定义了OS分配给ORACLE的最大内存数量,以GRANULE为单位进行分配.SGA小于1G为8M,
大于1G为16M.在10G后引入了SGA_TARGET参数,只要定了这个参数以后ORACLE可以自动调整分配内存.
      SGA_TARGET定义了以下组件总大小:fixed sga,log buffer,db cache,shared pool,streams pool,large pool,nonstandard db cache,db keep/recycle buffer.SGA_TARGET可以自动调整的部件有
DB CACHE,shared pool,java pool,streams pool,large pool.其他的一些组件需要手动更改,如DB_KEEP_CACHE_SZIE/DB_RECYCLE_CACHE_SIZE,和DB_nK_CACHE_SIZE.
    DB BUFFER CACHE存放了数据块的拷贝.DB CAHCE和SHARED POOL这两个区域逻辑地分为多个BUFFERS.
    DB CACHE由两个链表组成:WRITE LIST和LRU.WRITE LIST包含了脏的,但是还没有写到DISK的块,LRU包含了PINNED BUFFER,FREE BUFFER和没有移到WRITE LIST的脏块.当一个进程访问一个BUFFER时,进程把这个BUFFER移动到LRU和MRU端,当一个进程需要查找的块在CACHE中,称为CACHE HIT,否则CACHE MISSES.
当ORACLE进程需要读一个块到CACHE中时,扫描LRU看是否有空闲的BUFFER,当扫描LRU的长度超过40%时(X$KVIT,KVITTAG的值KCBFSP)还没有找到空闲的BUFFER,就不再扫描了,通知DBW0进程开始写WRITE LIST,然后把空闲块返回到LRU中.
    对于FULL TABLE SCAN的块不会放到LRU中的MRU端,而是放到LRU的LRU端,一般认为FULL TABLE SCNA的块会比较少使用,于是要尽快写出CACHE,也可以通过 ALTER TABLE XXX CAHCE来改变一个表的这种CAHCE行为.
   DB_KEEP_CACHE_SIZE包含了需要长期保存在内存的数据,DB_RECYCLE_CACHE_SIZE包含了不需要长期保存的数据.
   PGA是一个用来存放一个单独的进程的数据和控制信息.从OS的角度来看,PGA是一个进程的私有内存,而不像SGA那样的一组共享内存.PGA主要的三个部分有:PRIVATE SQL AREA,SESSION MEM,WORKAREA.全局的PGA可以通过PGA_AGGREGATE_TARGET来定义.需要注意v$PGASTAT和V$PROCESS的PGA_USED_MEM,PGA_ALLOCATE_MEM,PGA_MAX_MEM三列.
阅读(2126) | 评论(0) | 转发(0) |
0

上一篇:ORACLE data dictionary

下一篇:快速导入数据

给主人留下些什么吧!~~