oracle中的SGA和PGA

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

a.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)限制。
在专有服务器(Dedicated Server)模式下,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内存

### Oracle 数据库中调整 SGA PGA 参数的方法及最佳实践 #### 方法概述 在 Oracle 数据库中,SGA(System Global Area) PGA(Program Global Area)是两个重要的内存结构。SGA 是共享内存区域,用于存储数据缓冲区、重做日志缓冲区其他全局资源;而 PGA 则是非共享内存区域,主要用于会话私有数据工作区分配。 为了优化性能并合理利用硬件资源,可以采用手动或自动方式来配置这些参数。推荐的方式是启用 **自动内存管理** 功能,通过设置 `MEMORY_TARGET` 参数简化内存管理动态调整[^1]。 如果需要更精细控制,则可以通过显式定义以下参数实现: - 对于 SGA 的最小值,可使用 `SGA_TARGET` 参数。 - 对于 PGA 的最小值,可通过 `PGA_AGGREGATE_TARGET` 参数进行设定。 此外,在某些情况下可能还需要进一步微调具体的 PGA 工作区参数,例如 `SORT_AREA_SIZE`, `HASH_AREA_SIZE`, 或者 `BITMAP_MERGE_AREA_SIZE` 等,这通常适用于未开启自动内存管理模式的情况[^2]。 对于 ORACLE 19c 版本及其后续版本而言,当遇到 PGA 使用率过高或者频繁触发警告时,应仔细检查当前的工作负载特性以及是否存在异常的大查询操作,并适当增加 `PGA_AGGREGATE_TARGET` 值以缓解压力[^3]。 #### 实现代码示例 以下是针对不同场景下调整 SGA PGA 参数的具体 SQL 示例命令: ```sql -- 启用自动内存管理模式 (推荐) ALTER SYSTEM SET MEMORY_MAX_TARGET = '8G' SCOPE=SPFILE; ALTER SYSTEM SET MEMORY_TARGET = '6G' SCOPE=SPFILE; -- 手动指定 SGA PGA 最小目标值 ALTER SYSTEM SET SGA_TARGET = '4G' SCOPE=SPFILE; ALTER SYSTEM SET PGA_AGGREGATE_TARGET = '2G' SCOPE=SPFILE; -- 如果关闭了自动内存管理功能,需单独调节各子组件大小 ALTER SYSTEM SET DB_CACHE_SIZE='2G' SCOPE=BOTH; -- 调整 Buffer Cache 大小 ALTER SYSTEM SET SHARED_POOL_SIZE='1G' SCOPE=BOTH; -- 修改 Shared Pool 容量 -- 微调特定 PGA Work Areas 参数(仅限非 AMM 场景) ALTER SESSION SET SORT_AREA_SIZE = 52428800; -- 单位字节,默认单位为 BYTES ``` 以上脚本中的数值仅为示意,请依据实际环境需求做出相应更改后再执行上述语句。 --- #### 注意事项 需要注意的是,任何关于内存参数的重大变更都应在测试环境中充分验证其效果之后再推广到生产系统上实施。另外还要考虑到操作系统层面可用物理 RAM 总量以及其他运行进程所占用的份额等因素综合考量最终决策。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值