oracle 设置 sga_max_size参数,Oracle教程之SGA_MAX_SIZE参数

本文详细介绍了Oracle数据库中的SGA_MAX_SIZE参数,用于控制SGA的最大虚拟内存大小。内容涉及SGA的实际组成、内存分配策略以及如何通过调整SGA_MAX_SIZE影响数据库性能。在实例启动后,SGA会根据需求动态扩展,但总和受到SGA_MAX_SIZE限制。修改此参数需重启实例,并注意SGA_MAX_SIZE和SGA_TARGET参数的关系。
摘要由CSDN通过智能技术生成

SGA_MAX_SIZE

SGA_MAX_SIZE这个参数顾名思义,它用来控制SGA 使用虚拟内存 的最大大小,这里的虚拟内存的含义可能会有所模糊,先可以这样理解,就是Oracle

所能在内存中给SGA 分配的最大大小 。 现在来解释一下我这里“虚拟内存”的含义,确切的应该这样说:实际内存和虚拟内存。我们知道当OS

中实际内存不够使用的时候,OS 就会去使用虚拟内存。oracle 是运行与os 之上的一个系统软件,它也是一个程序,它所请求os 给它多少内存用来作为其sga

(比方说Oracle 申请500M 内存用作SGA ,即SGA_MAX_SIZE=500M ),os 一般是不会在oracle

启动的时候就给它全部的实际内存,而可能只给200M 。

随着程序的运行,Oracle 不断的需要内存,而假设计算机的所有实际内存只有500M ,那么很肯定的是OS 不可能把全部500M 实际内存分配给oracle

的sga ,可能也最多就给了350M ,剩下的150M 使用虚拟内存。Oracle 的SGA 达到500M 的时候(即达到SGA_MAX_SIZE

指定的大小),实际上这个sga 由350M 实际内存和150M 的虚拟内存组成,如果这个时候Oracle 想继续申请内存给SGA 使用,那么OS

是不会再给其分配内存,因为它已经达到了SGA_MAX_SIZE 的最大值。这个例子,虽然比较极端,即使OS 实际上比方说有1G 内存,Oracle 的SGA

也未必全部由实际内存组成,可能是由400M 实际内存和100M 的虚拟内存

组成,这是由操作系统的内存管理策略决定的。此时,很显然有个问题,假设我的机器物理内存(实际内存)足够多,如何让Oracle 所申请的SGA

内存全部在物理内存中呢,因为假设使用了虚拟内存,必定会带来额外的PAGE IN/PAGE OUT 的I/O

操作,这是很不合算的。这个问题其实就是在物理内存中固定SGA 的问题,这要涉及到另外两个参数LOCK_SGA 和PRE_PAGE_SGA

以及具体操作系统是否支持内存锁定的问题了,对此在这不予讨论。

因此可以简洁的这样说:当实例启动后,各个内存区只分配实例所需要的最小大小,在随后的运行过程中,再根据需要扩展他们的大小,而他们的总和大小受到了SGA_MAX_SIZE

的限制。

根据前面的SGA

的组成介绍,我们很容易得到一个计算SGA 的实际值的公式,如下:

SGA

实际大小 =

DB_CACHE_SIZE

+

DB_KEEP_CACHE_SIZE

+

DB_RECYCLE_CACHE_SIZE

+

DB_nk_CACHE_SIZE

+

SHARED_POOL_SIZE

+

LARGE_POOL_SIZE

+

JAVA_POOL_SIZE

+

STREAMS_POOL_SIZE (10g 中的新内存池)

+

LOG_BUFFERS+11K(Redo Log Buffer 的保护页)

+

1MB

+

16M(SGA 内部内存消耗,适合于9i 及之前版本)

而SGA_MAX_SIZE 就是它的各个部分内存区都达到定义的最大值的时候的大小之和。修改SGA_MAX_SIZE 的大小,必须要重新启动数据库实例。 这样就可能出现这样的一种情况,在spfile 中,SGA 各个内存区设置大小总和大于SGA_MAX_SIZE 。这时,oracle 会如下处理:当实例再次启动时,如果发现SGA各个内存总和大于SGA_MAX_SIZE,它会将SGA_MAX_SIZE的值修改为SGA各个内存区总和的值。

SQL> show parameter

sga;

NAME

TYPE        VALUE

------------------------------------

----------- ------------------------------

lock_sga

boolean     FALSE

pre_page_sga

boolean     FALSE

sga_max_size

big integer 276M

sga_target

big integer 276M

修改sga_max_size大小

SQL> alter

system set sga_max_size=300m scope=spfile;

System

altered.

修改后不会直接生效

SQL> show

parameter sga

NAME

TYPE                              VALUE

------------------------------------

--------------------------------- ------------------------------

lock_sga

boolean                           FALSE

pre_page_sga

boolean                           FALSE

sga_max_size

big integer 276M

sga_target                           big integer 276M

重启实例

SQL> shutdown

immediate

SQL>

startup

SQL> show

parameter sga

NAME

TYPE                              VALUE

------------------------------------

--------------------------------- ------------------------------

lock_sga

boolean                           FALSE

pre_page_sga

boolean                           FALSE

sga_max_size                  big

integer                     300M

sga_target

big integer                     276M

只有重新启动实例,设置才能生效。

但是现在两个值出现不一致现象,哪一个规定了SGA的最大值呢?

SQL> select

(sum(value))/1024/1024 "SIZE_MB" from v$sga;

size

mb

----------

300

查看SGA分配规定的总和,已经是300m了,但是......

SQL> select sum(bytes)/1024/1024

"SIZE_MB" from v$sgastat;

SIZE_MB

----------

276.00251

v$sgastat看到的是内存当前分配的详细信息,是sga_target的值

说明限制内存分配的参数还是由sga_target控制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值