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。
因此得出結論,證畢。