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。


因此得出結論,證畢。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章