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。
因此得出结论,证毕。