Oracle-SGA → sga_target and sga_max_size

1.环境摘要:


OS: PowerPC_Power5-570

Mem:6G

Database Version:Oracle10

Oracle_sid:ora10


2.SGA简介


SGA =  system global  Area


SGA是一组包含着一个Oracle实例的数据和控制信息的共享内存结构

*是为oracle系统分配的共享内存

*是实例的主要组成部分

*是影响数据库性能的最关键因素

*随着实例的启动、关闭而被分配、回收

*SGA自动对所有包含的各种缓存自动进行动态管理;



3.> SGA主要包含6类缓存:

db_buffer_cache 数据高速缓存

shared_pool 共享池

large_pool 大池

jave_pool java池

streams_pool 流池

redo_log_buffer 重做日志缓冲(不参与动态内存管理)


查看内存

SQL> show sga;


Total System Global Area 3221225472 bytes
Fixed Size                  2024344 bytes
Variable Size             704646248 bytes
Database Buffers         2499805184 bytes
Redo Buffers               14749696 bytes

或者

SQL> select * from v$sga;


NAME                      VALUE
-------------------- ----------
Fixed Size              2024344
Variable Size         704646248
Database Buffers     2499805184
Redo Buffers           14749696


查看SGA重要参数

SQL> show parameter sga;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     FALSE
sga_max_size                         big integer 3G
sga_target                           big integer 3G


4.*pre_page_sga  and  lock_sga 

pre_page_sga

数据库启动是否将全部SGA区都绑定到物理内存,而不使用交换分区

查看pre_page_sga状态

SQL> show parameter pre_page_sga;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pre_page_sga                         boolean     FALSE


*lock_sga

运行过程中是否将全部SGA区都绑定到物理内存,而不是用交换分区(linux/win平台不适用)


SQL> show parameter lock_sga;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
lock_sga                             boolean     FALSE



注意:在修改pre_page_sga时,需要同时修改lock_sga,否则,pre_page_sga修改不生效。



5.*sga_max_size  sga区上限值


sga_max_size可以改大,但是改小时受sga_target的限制,下面我们来演示一下;

首先:查看sga_max_size 和 sga_target大小

SQL> show parameter sga_max_size


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 3G
SQL> show parameter sga_target;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_target                           big integer 3G

有没有发现,sga_target 和 sga_max_size 是一样的。



接下来,我们将sga_max_size改大点(眺成4G)

SQL> alter system set sga_max_size=4G scope=spfile;(非动态生效,重启一下数据库)


System altered.


SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup open;
ORACLE instance started.


Total System Global Area 4294967296 bytes
Fixed Size                  2026400 bytes
Variable Size            1778386016 bytes
Database Buffers         2499805184 bytes
Redo Buffers               14749696 bytes
Database mounted.
Database opened.
SQL> show parameter sga_max_size;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 4G



看到了吧,调大的时候,没有任何错误,接下来我们模拟将sga_max_size调小;


先查看一下sga_target大小

SQL> show parameter sga_target;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_target                           big integer 3G


为 3G,


现在讲sga_max_size调成2G,理论上,是不是等我们这个成功后,得到的sga_max_size=2G呢?

SQL> alter system set sga_max_size=2G scope=spfile;


System altered.


SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup open;
ORACLE instance started.


Total System Global Area 3221225472 bytes
Fixed Size                  2024304 bytes
Variable Size             704646288 bytes
Database Buffers         2499805184 bytes
Redo Buffers               14749696 bytes
Database mounted.
Database opened.
SQL> show parameter sga_max_size;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 3G


看到了没?事实上,当sga_max_size的最小下限就是 sga_target,这就是为什么说sga_max_size可以改大,但是改小时受sga_target的限制。


6.ASMM 自动内存管理

在上面的试验中,我们提到了ASMM,这里我们对ASMM结合sga进行一下研究!


先show一下结论,然后我们再对他们进行一一求证!


结论一:在sga_max_size = sga_target情况下 ,sga_max_size = sga_target=data_buffer_cache+shared_pool,jave_pool+large_pool+log_buffer(单位:大小)


结论二:在sga_max_size ≠  sga_target情况下,sga_max_size  >  sga_target=data_buffer_cache+shared_pool,jave_pool+large_pool+log_buffer(单位:大小)


验证结论一:


首先确定,内存管理模式为ASMM;

SQL> show parameter db_cache_size;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_cache_size                        big integer 0
SQL> show parameter shared_pool_size;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
shared_pool_size                     big integer 0
SQL> show parameter java_pool_size;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
java_pool_size                       big integer 0
SQL> show parameter large_pool_size;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
large_pool_size                      big integer 0


此时确定内存为ASMM管理模式。

现在查看sga各个参数的和 和  sga_target 的关系


SQL> select pool,sum(bytes) from v$sgastat group by pool;


POOL         SUM(BYTES)
------------ ----------
             2516579184  (data_buffer_cache大小
shared pool   671093432
large pool     16777216
java pool      16777216

查看 data_buffer_cache大小
SQL> select current_size from v$buffer_pool;


CURRENT_SIZE
------------
        2384


SQL> select 2516579184/1024/1024 from dual;


2516579184/1024/1024
--------------------
          2399.99693


SQL> select 2516579184+671093432+ 16777216*2 from dual; (SGA各参数总和


2516579184+671093432+16777216*2
-------------------------------
                     3221227048 


SQL> select   3*1024*1024*1024 from dual;   3G换算成bytes,恰好等于SGA各参数总和


3*1024*1024*1024
----------------
      3221225472


综上,结论一正确。



结论二验证:


首先将sga_target设置成1G,同时将SGA中任一参数设置为非0,请看

SQL> alter system set sga_target=1Gscope=both;


System altered.

SQL> show parameter sga_target;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_target                           big integer 1G


SQL> show parameter sga_max_size;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 3G


此时,sga_max_size  >  sga_target,再看看sga各个参数的总和 =  ???


SQL> select pool,sum(bytes) from v$sgastat group by pool;


POOL         SUM(BYTES)
------------ ----------
              369095536
shared pool   671093432
large pool     16777216
java pool      16777216


此时,sga各个参数之和  =  sga_target 


结论二(事实上,sga_target就是sga各个参数和的上限值),证毕。


此外,在求证结论二过程中,我们是不是发现了,sga_target的调整,是可以动态的哦,也就是说调整后,无需重启数据库。



7.sga内存颗粒度大小granule_size

若SGA<1G,granule_size=4M

若SGA>1G,granule_size=8M(For win),granule_size=16M(for other)

下面,我们演示一下:

先确定,SGA > 1G

SQL> show parameter sga;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
lock_sga                             boolean     FALSE
pre_page_sga                         boolean     FALSE
sga_max_size                         big integer 3G
sga_target                           big integer 1G


先查看各个缓冲区的大小

SQL> select pool,sum(bytes) from v$sgastat group by pool;


POOL         SUM(BYTES)
------------ ----------
              369095536
shared pool   671093432
large pool     16777216
java pool      16777216(16M)


SQL> show parameter java_pool_size;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
java_pool_size                       big integer 16M
SQL> alter system set java_pool_size=24M;(调整java_pool_size 到24M)


System altered.


SQL>  show parameter java_pool_size;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
java_pool_size                       big integer 32M

得到的值为 2*16M
SQL> alter system set java_pool_size=3M ;(调整java_pool_size 到3M)

System altered.

SQL> show parameter java_pool_size;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
java_pool_size                       big integer 16M


得到的值为 1*16M。


因此得出结论,证毕。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值