oracle中的sga包含了几个主要的部分
1.shared pool 共享池
2.database buffer cache 数据库高速缓冲区
3.redo log buffers 重做日志缓冲区
4.large pool 大池
5.java pool java池
oracle中的sga包含了几个主要的部分
1.shared pool 共享池
2.database buffer cache 数据库高速缓冲区
3.redo log buffers 重做日志缓冲区
4.large pool 大池
5.java pooljava池
a.shared pool:
oracle shared pool包括library cache(库缓存)和dictionary cache(数据字典高速缓存)
library cache中包含了共享sql区和共享pl/sql区两部分,他们分别存放sql和pl/sql语句以及相关的信息。oracle通过一个称为LRU(least recently used)队列的算法来实现对library cache管理的。其算法大致如下:刚刚使用过的内存块(的地址)放在LRU队列的头上,当一个服务器进程需要library cache的内存空间时该进程就从LRU对列的尾部获取所需的内存块,这些内存块一旦被使用他们(的地址)就立即放在LRU对列的最前面,这样那些长时间没有使用过的内存块将自然地移动到LRU对列的尾部而最先被使用。为了能够共享sql和pl/sql的代码,library cache要足够大。不过oracle并没有修改library cache大小的参数。只能间接地通过修改shared pool来修改library cache的大小。长时间的使用shared pool会产生许多碎片如果在shared pool中没有足够的连续空间来装载目标数据就会产生错误,所以oracle提供了flush_shared_pool参数来刷新shared pool
语句:
alter system set shared_pool_size=48M;
alter system flush_shared_pool;
dictionary cache:数据库对象的信息存储在数据字典表中,当数据库需要这些信息的时候,将读取字典表并将返回的数据存储在dictionary cache中。dictionary cache也是通过LRU算法来使用数据块。dictionary cache是shared pool的一部分,不能单独设置其大小,只能同过修改shared_pool_size参数在修改。当查询数据字典的速度缓慢时,应该加大shared_pool_size。
b.database buffer cache:
oracle修改数据时,服务器进程将首先在database buffer cache中搜索所需要的数据,如果找到了就直接使用而不进行磁盘搜索,如果没有找到就进行磁盘操作,把数据文件中的数据读入到database buffer cache中。修改后,当达到一定条件时,会由DBWn进程负责把database buffer cache中的数据写入到数据文件中。oracle也是使用LRU算法来实现对database buffer cache的管理的。可以使用db_block_size和db_block_buffers来设置database buffer cache的大小,其中db_block_size是在创建数据库时固定了的,创建完数据库后不可修改。而db_block_buffers的算法是48M/db_block_size。如果SGA的大小不足以容纳所使用的数据,那么其他缓冲区将争用database buffer cache的空间,使数据库性能下降。多个程序共享一个SGA时易出现这种现象。 当什么时候DBWn进程才将database buffer cache中的数据写入到数据文件中呢 :
1.Checkpoint的时候
2.当buffer cache中没有足够的free buffer的时候。
c.redo log buffers:
当数据库中的数据被修改时,后台进程LGWR将修改的内容,记录到redo log中,以便在数据库恢复过程中实现回滚。然而在被写入到redo log之前,事物首先被记录在redo log buffers中。当达到一定条件后将激活LGWR进程来写入redo log文件中。而这几个条件分别是:
1.发生提交。
2.到达LGWR非活动时限。
3.redo log buffers中的数据达到redo log buffers 1/3时。
4.DBWn在检查点完成database buffer cache的刷新。
d.large pool:
Large Pool是一种类似共享池的SGA缓冲池,和共享池不同的是,只有少量类型的对象可以在Large Pool中创建。Large Pool的空间不在共享池中分配,是在数据库启动的时候另外分配的。Large Pool的大小由LARGE_POOL_SIZE确定。Oracle数据库也可以不配置Large Pool。从Oracle 8开始,Oracle数据库引入了Large Pool,在Oracle 8中,Large Pool的主要功能由两个:
1.为MTS(共享服务器的早期版本)模式的会话分配UGA空间.
2.作为连续文件IO的缓冲,比如系统管理的恢复和rman备份恢复(当RMAN使用了多个IO SLAVES的时候)
在一般情况下LARGE POOL使用需求不大,因此不必要设置过大的LARGE POOL.
e.java pool:
引入java pool的目的是能够编译java语言的命令,如果要使用java语言,就必须要设置java pool。java语言早oracle数据库中的存储于pl/sql语言几乎完全相同。可以通过参数java_pool_size的值来设置java pool的大小,其单位是字节(bytes)。在oracle9i中java pool的默认大小是24M。
PGA
(Program Global Area程序全局区)是一块包含一个服务进程的数据和控制信息的内存区域。它是Oracle在一个服务进程启动是创建的,是非共享的。一个Oracle进程拥有一个PGA内存区。一个PGA也只能被拥有它的那个服务进程所访问,只有这个进程中的Oracle代码才能读写它。因此,PGA中的结构是不需要Latch保护的。
我们可以设置所有服务进程的PGA内存总数受到实例分配的总体PGA(Aggregated PGA)限制。
在专有服务器(DedicatedServer)模式下,Oracle会为每个会话启动一个Oracle进程;
而在多线程服务(Multi-Thread Server MTS)模式下,由多个会话共享同一个Oracle服务进程。
PGA中包含了关于进程使用到的操作系统资源的信息,以及一些关于进程状态的信息。
而关于进程使用的Oracle共享资源的信息则是在SGA中。
这样做可以使在进程以外中止时,能够及时释放和清除这些资源。
相关视图
V$PGASTAT
V$PGASTAT提供了PGA内存使用情况的统计信息和当自动PGA内存管理启动时的统计信息。
视图里面的累加数据是自从实例启动后开始累加的。
V$SYSSTAT,V$SESSTAT
这两个视图显示了系统(会话)的统计数据。他们的统计项目基本相同,
但不同之处在于一个是系统级的、一个是会话级的。
V$PROCESS
这个视图显示了所有Oracle进程的信息。其中以下几个字段则说明了进程PGA内存的使用情况。
PGA_USED_MEM:进程使用的PGA内存
PGA_ALLOCATED_MEM:分配给进程的PGA内存
PGA_MAX_MEM:进程使用的最大的PGA内存
========================================================
http://www.cnblogs.com/xiaoyi0815/archive/2010/11/15/1877644.html