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) |