用show sga可以查看SGA的大小,show sga的結果都有如下的格式:
Total System Global Area AAAAA bytes
Fixed Size BBBBB bytes
Variable Size CCCCC bytes
Database Buffers DDDDD bytes
Redo Buffers EEEEE bytes
這裡給出一台測試上Oracle執行個體的sga資訊:
Total System Global Area 369098752 bytes
Fixed Size 1219496 bytes
Variable Size 171967576 bytes
Database Buffers 188743680 bytes
Redo Buffers 7168000 bytes
其中各部分的含義如下:
Fixed Size: 這部分是Oracle內部使用的一個區,Oracle通過這個區找到SGA其他區,類似一個SGA各個組件的索引,不同平台和不同版本下這部分的大小可能不一樣。
Variable Size: 包括 shared pool ,java pool ,large pool, 管理db_block_buffers 的記憶體、管理控制檔案資訊的記憶體等等,其他管理和控制Oracle 內部結構的記憶體[這部分通常被稱為Overhead],也就有了如下的公式:
Variable Component(Show SGA) = Shared Pool + Large Pool + Java Pool + Overhead + Free Memory(9i 之前的版本)
Overhead的大小受如下初始化參數的影響:db_files, open_cursors ,processes ,具體演算法未知。
Database Buffers: 為db_cache_size、db_keep_cache_size、db_recycle_cache_size、 db_nk_cache_size的總大小,當然這是sga_target為0的情況,也就是手動SGA管理員模式下,如果是自動SGA管理(sga_target>0),則這個值根據sga的分配情況自動進行調整。
Redo Buffers:這部分是實際分配的Redo log buffer的大小,由初始化參數log_buffer根據SGA的最小分配單位granule 向上取整得到。
這裡給出一個測試資料庫執行個體的log_buffer參數大小:
SQL> show parameter log_buffer;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_buffer integer 7057408
實際的Redo log buffer大小也可以通過v$sgastat視圖查看,和show sga命令是同樣的結果:
SQL> select * from v$sgastat where name='log_buffer';
POOL NAME BYTES
------------ -------------------------- ----------
log_buffer 7168000
因為這裡sga為352MB<1G,所以granule為4MB,也可以通過以下命令查詢獲得:
SQL> select * from v$sgainfo where name = 'Granule Size';
NAME BYTES RES
-------------------------------- ---------- ---
Granule Size 4194304 No
預設的SGA中的Fixed Size將和log_buffer共用整數倍的granule:
SQL> select (1219496 +7168000)/4194304 from dual;
(1219496+7168000)/4194304
-------------------------
1.99973488
因為精確度也只到位元組,所以比值也有可能有誤差。