一. SGA的組成:

     自動 SGA 管理後,Oracle 可以自動為我們調整以下記憶體池的大小:
shared pool
buffer cache
large pool
java pool
streams pool
需要手動調整的引數
log buffer
db_nk_cache_size
db_keep_cache_size
db_recycle_cache_size

1.1 shared pool調整

1.1.1查詢SGA的大小

 SQL> show parameter sga_target

 NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_target big integer 276M
SQL>

1.1.2 SGA元件

  通過以上語句可以看到 SGA 的大小是289406976.那麼它如何分配的,通過以下語句可以看到:

SQL> select t.COMPONENT,t.CURRENT_SIZE/1024/1024 "CURRENT_SIZE (MB)"from v$sga_dynamic_components t;

COMPONENT                      CURRENT_SIZE (MB)
------------------------------ -----------------
shared pool 76
large pool 4
java pool 4
streams pool 0
DEFAULT buffer cache 188
KEEP buffer cache 0
RECYCLE buffer cache 0
DEFAULT 2K buffer cache 0
DEFAULT 4K buffer cache 0
DEFAULT 8K buffer cache 0
DEFAULT 16K buffer cache 0 COMPONENT CURRENT_SIZE (MB)
------------------------------ -----------------
DEFAULT 32K buffer cache 0
ASM Buffer Cache 0 13 rows selected. SQL>

SGA 實際大小 = DB_CACHE_SIZE + DB_KEEP_CACHE_SIZE + DB_RECYCLE_CACHE_SIZE + DB_nk_CACHE_SIZE + SHARED_POOL_SIZE  + LARGE_POOL_SIZE + JAVA_POOL_SIZE + STREAMS_POOL_SIZE(10g 中的新記憶體池)+ LOG_BUFFERS+11K(Redo Log Buffer 的保護頁) + 1MB + 16M(SGA 內部記憶體消耗,適合於 9i 及之前版本)

1.1.3 檢視對shared pool設定的建議

  一般來說,設定 1GB 以上的 shared pool 不會給效能帶來明顯的提高,相反,這將給 Oracle管理 shared pool 以及監控 shared pool 的過程中帶來較多的麻煩。只要將初始化引數 statistics_level 設定為 typical 或者all 就啟動對 shared pool 的建議,basic 為關閉該功能。可以通過檢視v$shared_pool_advice 來檢視對shared pool設定的建議。

 select t.SHARED_POOL_SIZE_FOR_ESTIMATE "SP",
t.ESTD_LC_SIZE "EL",
t.ESTD_LC_MEMORY_OBJECTS "ELM",
t.ESTD_LC_TIME_SAVED "ELT",
t.ESTD_LC_TIME_SAVED_FACTOR "ELTS %",
t.ESTD_LC_MEMORY_OBJECT_HITS "ELMO"
from v$shared_pool_advice t
; SP EL ELM ELT ELTS % ELMO
---------- ---------- ---------- ---------- ---------- ----------
52 9 1136 3670 .9892 65132
60 15 2021 3700 .9973 65735
68 22 3147 3705 .9987 65859
15 76 29 3712 3710 1 65984
84 36 4359 3786 1.0205 66129
92 43 4828 3786 1.0205 66156
100 49 5785 3786 1.0205 66159
108 49 5785 3786 1.0205 66159
116 49 5785 3786 1.0205 66159
124 49 5785 3786 1.0205 66159
132 49 5785 3786 1.0205 66159 SP EL ELM ELT ELTS % ELMO
---------- ---------- ---------- ---------- ---------- ----------
140 49 5785 3786 1.0205 66159
148 49 5785 3786 1.0205 66159
156 49 5785 3786 1.0205 66159

  我們主要關注 estd_lc_time_saved_factor 列的值,當該列的值為 1 時表示再增加 shared pool的大小對效能的提高沒有意義,對於上面例子來說,當 shared pool 為 76MB 時達到最佳。

 注:
--ESTD_LC_SIZE:估計庫快取記憶體的使用數量(以兆位元組為單位)
--ESTD_LC_MEMORY_OBJECTS: 估算共享池中庫快取的記憶體物件數
--ESTD_LC_TIME_SAVED: 估算將可以節省的解析時間
--ESTD_LC_TIME_SAVED_FACTOR: 估算的節省的解析時間與當前節省解析時間的比
--ESTD_LC_MEMORY_OBJECT_HITS: 估算可以直接從共享池中命中庫快取的記憶體物件的命中次數

1.1.4 檢視對buffer cache設定的建議

  在如何設定 buffer cache 的大小上,從 Oracle 9i開始通過初始化引數 db_cache_advice來啟動 buffer cache 顧問。Oracle 會監控 default 型別,keep 型別和 recycle 型別的 buffer cache的使用,以及其他 5 種不同資料庫尺寸(2, 4, 8, 16 或 32KB)的 buffer cache 的使用。Oracle會根據當前所監控到的物理讀的速率,估算出在不同大小尺寸的 buffer cache 下,所產生的可能的物理讀的數量。Oracle將這些資訊放入 v$db_cache_advice 中,每種型別的 buffer cache都會有相應的若干條記錄來表示所建議的buffer cache 的大小。下面是對於預設資料塊尺寸的 buffer cache 的建議大小應該是多少。

 SELECT size_for_estimate "target M", buffers_for_estimate,estd_physical_read_factor "physical_read %", estd_physical_reads
FROM V$DB_CACHE_ADVICE
WHERE name = 'DEFAULT'
AND block_size = (SELECT value FROM V$PARAMETER WHERE name = 'db_block_size')
AND advice_status = 'ON'; target M BUFFERS_FOR_ESTIMATE physical_read % ESTD_PHYSICAL_READS
---------- -------------------- --------------- -------------------
16 1996 2.5056 30293
32 3992 1.5932 19262
48 5988 1.306 15790
64 7984 1.1789 14253
80 9980 1.0866 13137
96 11976 1.0254 12397
15 112 13972 1 12090
16 128 15968 1 12090
17 144 17964 1 12090
18 160 19960 1 12090
19 176 21956 1 12090
20
21 target M BUFFERS_FOR_ESTIMATE physical_read % ESTD_PHYSICAL_READS
22 ---------- -------------------- --------------- -------------------
23 188 23453 1 12090
24 192 23952 1 12090
25 208 25948 1 12090
26 224 27944 1 12090
27 240 29940 1 12090
28 256 31936 1 12090
29 272 33932 1 12090
30 288 35928 1 12090
31 304 37924 1 12090
320 39920 .8616 10417 21 rows selected. SQL>
 注:
--size_for_estimate : 預測效能資料的Cache大小
--buffers_for_estimate: 預測效能資料的Cache大小(緩衝塊數)
--estd_physical_read_factor: 如果緩衝大小為SIZE_FOR_ESTIMATE 時,建議器預測物理讀數與當前實際物理讀數的比率值。如果當前物理讀數為 0,這個值為空。
--estd_physical_reads: 如果緩衝大小為 SIZE_FOR_ESTIMATE 時,建議器預測物理讀數。

  當前我們的DB_CACHE_SIZE為112-304M,可以看到,它的物理讀因子為1,物理讀數為12090。那麼如何根據這些資料調整DB_CACHE_SIZE呢?給出一個方法,找到變化率較平緩的點作為採用值。因為建議器做預測是,DB_CACHE_SIZE的預測值的增長步長是相同的,是16M。我們按照這一步長增加DB_CACHE_SIZE,如果每次增加物理讀降低都很明顯,就可以繼續增加,直到物理讀降低不明顯,說明繼續增加DB_CACHE_SIZE沒有太大作用。當然,效能和可用資源是天平的兩端,你需要根據自己系統的實際情況調整。