System Global Area (SGA) 是 Oracle 執行個體核心共享記憶體結構。Oracle 10g 引入自動共享記憶體管理 (ASMM),透過 SGA_TARGET 參數動態調整各組件大小。本文詳細解析 SGA 組件、記憶體顆粒機制、SGA_MAX_SIZE 硬性上限、ASMM 啟用條件與手動/自動模式切換實務。
| 組件 | 初始化參數 | 功能 | ASMM 管理 |
|---|---|---|---|
| 共用池 | SHARED_POOL_SIZE | SQL/PLSQL 執行計畫、資料字典快取 | 自動 |
| 大型池 | LARGE_POOL_SIZE | 備份/恢復、共用伺服器 UGA、平行執行訊息 | 自動 |
| Java 池 | JAVA_POOL_SIZE | JVM 物件、程式碼快取 | 自動 |
| 資料庫快取 | DB_CACHE_SIZE | 資料塊緩衝區 (預設/Keep/Recycle 池) | 自動 |
| Redo Log Buffer | LOG_BUFFER | Redo 記錄緩衝,順序寫入 | 手動 |
| Keep/Recycle 快取 | DB_KEEP_CACHE_SIZE DB_RECYCLE_CACHE_SIZE | 特定物件保留/淘汰策略 | 手動 |
| 非標準區塊大小快取 | DB_nK_CACHE_SIZE | 跨表空間區塊大小支援 | 手動 |
| Streams 池 | STREAMS_POOL_SIZE | Streams 複寫/佇列 | 手動 (10gR2 起可自動) |
| 固定 SGA / 內部分配 | 不可設定 | 執行個體啟動資訊、鎖結構 | 固定 |
SGA_MAX_SIZE 決定:
SELECT * FROM V$SGAINFO WHERE NAME = 'Granule Size';SGA_TARGET 動態調整上限 = SGA_MAX_SIZE。
-- 1. 確認 STATISTICS_LEVEL
SHOW PARAMETER statistics_level; -- 必須 TYPICAL 或 ALL
-- 2. 設定 SGA_TARGET > 0 (單位:Bytes/K/M/G)
ALTER SYSTEM SET sga_target = 2G SCOPE=BOTH;
-- 3. 將自動管理組件參數設為 0 (或移除)
ALTER SYSTEM SET shared_pool_size = 0 SCOPE=SPFILE;
ALTER SYSTEM SET large_pool_size = 0 SCOPE=SPFILE;
ALTER SYSTEM SET java_pool_size = 0 SCOPE=SPFILE;
ALTER SYSTEM SET db_cache_size = 0 SCOPE=SPFILE;
-- 手動組件 (LOG_BUFFER, DB_KEEP_CACHE_SIZE 等) 保留原值
-- 4. 重啟實例 (若參數用 SPFILE SCOPE=SPFILE)
SHUTDOWN IMMEDIATE; STARTUP;
-- 檢視各組件目前大小
SELECT component, current_size/1024/1024 AS "MB" FROM v$sga_dynamic_components;
-- 檢視動態調整歷程
SELECT component, oper_type, oper_mode, parameter, initial_size/1024/1024 AS "Init MB",
target_size/1024/1024 AS "Target MB", final_size/1024/1024 AS "Final MB"
FROM v$sga_resize_ops ORDER BY start_time DESC;
SELECT (
(SELECT SUM(value) FROM v$sga) -
(SELECT current_size FROM v$sga_dynamic_free_memory)
) AS "SGA_TARGET" FROM dual;
ALTER SYSTEM SET sga_target = 0 SCOPE=SPFILE;
-- 重啟後需手動設定各組件大小
DB_KEEP_CACHE_SIZE/DB_RECYCLE_CACHE_SIZE 手動管理關鍵熱/冷表。V$SGA_RESIZE_OPS,若頻繁縮放同一組件,考慮給該組件最小值 (如 SHARED_POOL_SIZE=200M) 避免震盪。USE_INDIRECT_DATA_BUFFERS=TRUE (參見 93087)。掌握 SGA 顆粒機制與 ASMM 運作邏輯,能讓 DBA 從繁瑣的記憶體手動調校中解脫,專注於 SQL 調優與架構優化。