ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle的sga和pga

oracle的sga和pga

原创 Linux操作系统 作者:hynixm 时间:2011-07-18 16:20:36 0 删除 编辑

转载:http://blog.csdn.net/jeston/article/details/4009159

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(数据字典高速缓存)

 

1)、library cache中包含了共享sql区和共享pl/sql区两部分,他们分别存放sqlpl/sql语句以及相关的信息。oracle通过一个称为LRU(least recently used)队列的算法来实现对library cache管理的。其算法大致如下:刚刚使用过的内存块(的地址)放在LRU队列的头上,当一个服务器进程需要library cache的内存空间时该进程就从LRU对列的尾部获取所需的内存块,这些内存块一旦被使用他们(的地址)就立即放在LRU对列的最前面,这样那些长时间没有使用过的内存块将自然地移动到LRU对列的尾部而最先被使用。为了能够共享sqlpl/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;

 

2)、dictionary cache:数据库对象的信息存储在数据字典表中,当数据库需要这些信息的时候,将读取字典表并将返回的数据存储在dictionary cache中。dictionary cache也是通过LRU算法来使用数据块。dictionary cacheshared 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_sizedb_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 pooljava语言早oracle数据库中的存储于pl/sql语言几乎完全相同。可以通过参数java_pool_size的值来设置java pool的大小,其单位是字节(bytes)。在oracle9ijava pool的默认大小是24M

 

 

 

 

 

PGA

 

Program Global Area程序全局区)是一块包含一个服务进程的数据和控制信息的内存区域。它是Oracle在一个服务进程启动是创建的,是非共享的。一个Oracle进程拥有一个PGA内存区。一个PGA也只能被拥有它的那个服务进程所访问,只有这个进程中的Oracle代码才能读写它。因此,PGA中的结构是不需要Latch保护的。

我们可以设置所有服务进程的PGA内存总数受到实例分配的总体PGAAggregated PGA)限制。

在专有服务器(DedicatedServer)模式下,Oracle会为每个会话启动一个Oracle进程;

而在多线程服务(Multi-Thread Server MTS)模式下,由多个会话共享同一个Oracle服务进程。

PGA中包含了关于进程使用到的操作系统资源的信息,以及一些关于进程状态的信息。

而关于进程使用的Oracle共享资源的信息则是在SGA中。

这样做可以使在进程以外中止时,能够及时释放和清除这些资源。

 

 

 

相关视图

V$PGASTAT

V$PGASTAT提供了PGA内存使用情况的统计信息和当自动PGA内存管理启动时的统计信息。

视图里面的累加数据是自从实例启动后开始累加的。

 

 

V$SYSSTATV$SESSTAT

这两个视图显示了系统(会话)的统计数据。他们的统计项目基本相同,

但不同之处在于一个是系统级的、一个是会话级的。

 

 

V$PROCESS

这个视图显示了所有Oracle进程的信息。其中以下几个字段则说明了进程PGA内存的使用情况。

PGA_USED_MEM:进程使用的PGA内存

PGA_ALLOCATED_MEM:分配给进程的PGA内存

PGA_MAX_MEM:进程使用的最大的PGA内存


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25897089/viewspace-702499/,如需转载,请注明出处,否则将追究法律责任。

上一篇: Oracle数据块原理
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2011-06-02

  • 博文量
    31
  • 访问量
    34817