oracle的sga和pga

中的sga包含了几个主要的部分
1.shared pool 共享池
2.database buffer cache高速缓冲区
3.redo log buffers 重做日志缓冲区
4.large pool 大池
5.java pool

a.shared pool:
oracle shared pool包括library cache(库缓存)和dictionary cache(数据字典高速缓存)

library cache中包含了共享区和共享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)限制。
在专有服务器(Dedicated)模式下,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内存

你可能感兴趣的:(database,oracle,cache,buffer,database,dictionary,数据库)