Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1825566
  • 博文数量: 323
  • 博客积分: 5970
  • 博客等级: 大校
  • 技术积分: 2764
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-03 23:13
文章分类

全部博文(323)

文章存档

2018年(2)

2017年(11)

2016年(10)

2015年(27)

2014年(2)

2013年(30)

2012年(197)

2011年(44)

分类: Oracle

2012-04-26 10:43:32

oracle内存结构及工作原理:
1、内存结构(包括sga和pga两部分)
11g之前,需要手工配置sga_max_size、sga_target和pga_aggregate_target。
例如:我们配置sga最大尺寸为1024M,pga尺寸为512M,Oracle运行模式如下:
实例启动后,比如,sga需要128M内存,则操作系统会分配给sga128M,高峰期到达之后,sga需要额外增加512M,则操作系统会再给sga分配512M,但sga最大尺寸不能超过1024M,如果Oracle在一个很偶然的机会(当然这种场景是很少出现的,否则oracle的内存配置就是有问题了),sga需要1.5G的内存,操作系统也只会分配1024M,sga不足,oracle只能在sga=1024M的情况下运行,即sga<=1024M,pga<=512M。
在11g时,增加了自动内存管理技术,对应的后台进程为mman,当使用自动内存管理后,则系统会启动mman。
mman可以实现oracle内存部件的自动调配,我们只需要配置一个总的内存尺寸即可,配置在sga_max_size上;
例如:我们配置oracle总内存尺寸为1.5G,sql代码如下:alter system set sga_max_size=1.5G,
实例启动后,操作系统只分配必须的很少的内存尺寸,当sga需要128M内存,则操作系统分配给sga128M;然后有64M空闲下来后,则由mman将空闲的64M释放给操作系统;当高峰期上来后,sga需要额外增加1G内存,则操作系统额外再分配给sga1G,则当前sga使用尺寸为1G+128M,总的内存尺寸sga+pga<=1.5G;
mman相对于手工配置,优势在于sga和pga可以动态调配,实现内存部件更灵活的使用。
11、sga(系统全局区,所有用户进程共享使用缓冲区数据)
111、数据高速缓冲区
    用来保存用户最近从磁盘数据文件访问的数据块的副本,这样当再由用户访问相同的数据时,则可以直接从数据高速缓冲区读取,不用再访问磁盘(注:磁盘I/O的速率是毫米级的,而内存I/O的速率为纳秒级)
 1111、包括三个类型区
  11111、脏的区(dirty buffer):用来保存从磁盘数据文件读取来的、已经修改过、并且还没有写入磁盘数据文件的数据。
  11112、自由区(free buffer):没有任何数据,并且可以写入数据的空闲内存区;
  11113、保留区(pinned buffer):用来保存正在被使用,或者明确留作将来使用的数据,主要指,从磁盘数据文件内读取到、等待服务器进程更改的数据,或者正在被更改的数据。
 1112、数据高速缓冲区可配置一个或2个或3个缓冲区池,我们在create或alter表或索引时,可以指定该表或索引属于哪个缓冲区池;
  11111、保持缓冲区池(db_keep_cache_size):用来保存一些需要频繁访问的小表,防止这些小表的数据被LRU命中;
  11112、回收缓冲区池(db_recycle_cache_size):用来保存一些很少使用的大表,在缓冲区处理完之后,立即清除,节省缓存空间;
  11113、默认缓冲区池(db_cache_size):用来保存除db_keep_cache_size和db_recycle_cache_size之外的所有数据;
  11114、子高速缓存(db_nk_cache_size):主要针对不同的oracle块尺寸来设置的,
数据高速缓冲区尺寸=db_keep_cache_size+db_recycle_cache_size+db_cache_size+db_nk_cache_size;
111、重演日志缓存(log_buffer)
    用来保存数据库内的变更,由LGWR立即写入联机重做日志文件
111、共享池(shared_pool_size):包括库高速缓存和数据字典高速缓冲两部分
  1111、库高速缓存:主要用来保存分析过的sql代码,所谓的“分析”是指,校验用户请求sql代码的语法,并且判断sql代码涉及的表和字段在数据库内是否存在;
    调优手段:通过动态视图v$librarycache,判断公式:sum(reloads)/sum(pins),如果结果约等于0,则证明库高速缓存命中率是合适的;如果结果>1,则需要增大共享池设置(shared_pool_size);
  1112、数据字典高速缓存:主要用来保存服务器最近从磁盘数据字典内访问过的数据,主要包括表结构、用户、实体等信息,如果再有用户请求时,则服务器进程会首先从数据字典高速缓存内检索,在缓冲区内是否存在该请求用户的相关权限信息,如果没有的话,需要访问磁盘数据字典(注:访问磁盘数据字典是最消耗资源的,相对于访问其他磁盘文件来说)
    调优手段:通过动态视图v$rowcache,判断公式:(1-sum(getmisses)/(sum(getmiss)+sum(getmisses)))*100,如果结果>90,证明命中率是合适的,否则需要增大共享池设置;(注:oracle没有直接设置库高速缓冲和数据字典高速缓冲的地方,需要通过调整共享池尺寸实现)
111、大型池(large_pool_size)
    主要为执行一些非常复杂并且耗时很长的sql代码提供空间,例如在执行备份操作时,需要存放备份缓冲区;
111、Java池(java_pool_size)
    主要为实例化的Java对象提供的堆空间,如果数据库中存在大量的java代码,就可以使用该设置,不用占用常规的sga;
111、流池(streams_pool_size)
    oracle支持流传输,主要用来实现与不同类型数据库,或者在不同应用环境下的数据共享;
111、其他结构(包括数据控制和锁的管理)

12、pga(程序全局区):每个用户会话都会在pga上占用一段独占的内存空间,pga上从属于该用户会话的内存空间,只允许该用户使用,其他用户不能访问。pga通过pga_size_mode可以设置自动或是手动内存配置。
    121、专有sql区域:用来保存该用户会话内的变量绑定信息和运行时区域内存结构,不允许其他用户访问。
    122、运行时区域:用来执行该用户会话内的sql代码,并且只允许该用户会话内sql代码执行。
举个简单的例子,说明sga和pga的区别:sga是共享的,pga是每个用户会话独占自己的pga。
例如,我们在酒店开房,有两种规格,一种是大床房,一种是单间。
sga就相当于大床房,大家都可以住在里边,共享大床房内的资源,该房客退房后,床位依然会保留,下一个人直接入住;
pga就相当于单间,每个用户只能占用自己的单间。如果一个房客预订了单间,酒店管理员则从资源库里,分配一个单间给该房客使用,这个单间只能给该房客使用,其他人不能进去。当该人退房时,酒店管理员收回这个单间,再有房客预订时,酒店管理员可以从资源库再分配该单间给新人。
阅读(1994) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~