系統全域區 (SGA) 是 Oracle 實例的核心共享記憶體區域。理解 SGA 內部結構、進程如何附掛存取、以及 UNIX 與 Windows 底層實作差異,是深入掌握 Oracle 架構的關鍵。
| 功能 | 說明 | 對應組件 |
|---|---|---|
| 維護內部資料結構 | 鎖、閂、佇列、SCN 等同步原語 | Shared Pool, Redo Log Buffer |
| 緩存磁碟資料 | 資料塊、索引塊、Undo 塊 | Database Buffer Cache |
| Redo 緩存 | 交易重做記錄先寫此處,再由 LGWR 刷盤 | Redo Log Buffer |
| 保存解析後 SQL 計畫 | Library Cache:共享 SQL 區、PL/SQL 程序 | Shared Pool |
/* 簡化流程 */
shmget(key, size, IPC_CREAT | 0660) → 取得共享記憶體段 ID (shmid)
shmat(shmid, NULL, 0) → 映射到進程虛擬位址空間,返回附掛位址
/* 進程現在可直接讀寫 SGA 位址範圍 */
ipcs -m 可查看 Oracle 共享記憶體段VirtualAlloc()/malloc() 分配於進程堆疊┌─────────────────────────────────────────────────────────────────┐ │ UNIX 架構 │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ PMON │ │ SMON │ │ DBW0 │ │ Server │ ... │ │ │ Process │ │ Process │ │ Process │ │ Process │ │ │ └────┬────┘ └────┬────┘ └────┬────┘ └────┬────┘ │ │ │ │ │ │ │ │ └────────────┴────────────┴────────────┘ │ │ │ │ │ shmat() │ │ │ ▼ │ │ ┌─────────────────────┐ │ │ │ SGA Shared Memory │ (Single Segment) │ │ │ Segment (shmid) │ │ │ └─────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ Windows 架構 │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ oracle.exe Process │ │ │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │ │ │PMON │ │SMON │ │DBW0 │ │Server│ │Server│ ... │ │ │ │ │Thread│ │Thread│ │Thread│ │Thread│ │Thread│ │ │ │ │ └──────┘ └──────┘ └──────┘ └──────┘ └──────┘ │ │ │ │ │ │ │ │ ┌─────────────────────────────────────────────────┐ │ │ │ │ │ SGA (Process Heap) │ │ │ │ │ └─────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘
| 層面 | UNIX 多進程 | Windows 多執行緒 |
|---|---|---|
| 進程隔離 | 強 (崩潰不波及他進程) | 弱 (單一進程崩潰全掛) |
| Context Switch 開銷 | 較大 (進程切換) | 較小 (執行緒切換) |
| 記憶體保護 | 進程級 (mprotect) | 需靠執行緒協作 |
| 大頁面支援 | 成熟 (HugePages) | Large Pages 支援良好 |
| 除錯/追蹤 | gdb/pstack 附掛進程 | Windbg 附掛進程/執行緒 |
| 擴展性上限 | 受限於 OS 進程上限 (pid_max) | 受限於虛擬記憶體/執行緒堆疊 |
-- 查看 SGA 組件大小
SELECT component, current_size/1024/1024 AS mb
FROM v$sga_dynamic_components;
-- UNIX: 查看共享記憶體段
! ipcs -m
# 輸出範例:
# 0x00000000 12345678 oracle 660 2097152 4 (2GB SGA)
-- Windows: 查看進程記憶體
! tasklist /FI "IMAGENAME eq oracle.exe" /FO LIST
# 或使用 VMMap / Process Explorer 觀察 Heap/Shared Memory 區域
vm.nr_hugepages = SGA_GB * 512 (2MB 頁),減少頁表、避免 SwapLock Pages in Memory 權限給 Oracle 服務帳號SGA 是 Oracle 實例的「心臟」,UNIX 採用 **System V Shared Memory + 多進程附掛**,Windows 採用 **單進程多執行緒 + 共享堆疊**。兩種模型各有優劣,但對 DBA 而言,關鍵在於:理解底層機制差異、正確配置 OS 級記憶體參數 (HugePages/Large Pages)、監控動態調整行為。這才是穩定高效運行 Oracle 的基石。