Oracle初始化參數之memory_target
一、引言:
Oracle 9i引入pga_aggregate_target,可以自動對PGA進行調整;
Oracle 10g引入sga_target,可以自動對SGA進行調整;
Oracle 11g則對這兩部分進行綜合,引入memory_target,可以自動調整所有的記憶體,這就是新引入的自動記憶體管理特性。
二、本文說明:
作業系統:rhel 5.4 x32
資料庫:oracle 11g r2
三、memory_target的介紹:
3.1、下面通過樣本瞭解一下memory_target的設定與PGA和SGA關係:
SQL> show parameter memory_target;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
memory_target big integer 316M
SQL> show sga;
Total System Global Area 330600448 bytes
Fixed Size 1336344 bytes
Variable Size 247466984 bytes
Database Buffers 75497472 bytes
Redo Buffers 6299648 bytes
SQL> alter system set memory_target=200m scope=spfile;
System altered.
SQL> alter system set sga_target=0 scope=spfile;
System altered.
SQL> alter system set pga_aggregate_target=0 scope=spfile;
System altered.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 209235968 bytes
Fixed Size 1335528 bytes
Variable Size 201330456 bytes
Database Buffers 4194304 bytes
Redo Buffers 2375680 bytes
Database mounted.
Database opened.
設定memory_target參數後,實際上Oracle會自動化佈建並調整一下兩個參數來分配SGA和PGA的記憶體,這和Oracle 10g自動化佈建sga_target後分配db_cache_size和shared_pool_size的機制是一樣的。
SQL> col ksppinm for a20;
SQL> col ksppstvl for a20;
SQL> select a.ksppinm name,b.ksppstvl value
2 from x$ksppi a,x$ksppcv b
3 where a.indx = b.indx
4 and (a.ksppinm like '%sga_target%'
5 or a.ksppinm like '%pga_aggregate_target%');
NAME VALUE
----------------------- -------------------
sga_target 0
__sga_target 142606336
pga_aggregate_target 0
__pga_aggregate_target 67108864
3.2、討論一下11g中memory_target設定和不設定對SGA/PGA的影響:
3.2.1、如果memory_target設定為非0值
(下面有四種情況來對SGA和PGA的大小進行分配)
3.2.1.1、sga_target和pga_aggregate_target已經設定大小
如果Oracle中已經設定了參數sga_target和pga_aggregate_target,則這兩個參數將各自被分配為最小值為他們的目標值。
memory_target = sga_target + pga_aggregate_target,大小和memory_max_size一致。
3.2.1.2、sga_target設定大小,pga_aggregate_target沒有設定大小
那麼pga_aggregate_target初始化值=memory_target-sga_target
3.2.1.3、sga_target沒有設定大小,pga_aggregate_target設定大小
那麼sga_target初始化值=memory_target-pga_aggregate_target
3.2.1.4、sga_target和pga_aggregate_target都沒有設定大小
Oracle 11g中對這種sga_target和pag_aggregate_target都沒有設定大小的情況下,Oracle將對這兩個值沒有最小值和預設值。Oracle將根據資料庫健全狀態進行分配大小。但在資料庫啟動是會有一個固定比例來分配:
sga_target = memory_target*60%
pga_aggregate_target = memory_target*40%
3.2.2、如果memory_target沒有設定或 = 0(在11g中預設為0)
11g中預設為0則初始狀態下取消了memory_target的作用,完全和10g在記憶體管理上一致,完全向下相容。(也有三種情況來對SGA和PGA的大小進行分配)
3.2.2.1、sga_target設定值,則自動調節SGA中的shared pool,buffer cache,redo log buffer,java pool,larger pool等記憶體空間的大小。PGA則依賴pga_aggregate_target的大小。sga和pga不能自動成長和自動縮小。
3.2.2.2、sga_target和pga_aggregate_target都沒有設定
SGA中的各組件大小都要明確設定,不能自動調整各組件大小。PGA不能自動成長和收縮。
3.2.2.3、memory_max_target設定而memory_target = 0這種情況先和10g一樣,不做說明。
更多詳情見請繼續閱讀下一頁的精彩內容: