sql > alter system set db_cache_size=xxxxM
命令時數據庫會報告錯 -- 沒有足夠的內存. 這是由操作系統引起的嗎?
不是,原因在於此時SGA區中沒有多餘空閒內存。儘管系統中有空閒內存,但未分配給SGA 區。
在oracle 9i 中 動態SGA的概念是無需經過 關閉實例(instance), 修改初始化參數文件和重啓實例這一過程,就可動態調整 buffer cache 和 share pool 的大小。 另外,動態SGA允許在實例運行時設置,下次啓動時將有多少物理內存分配給SGA 這一數據庫參數。 SGA 可用最大物理內存是由SGA_MAX_SIZE 參數來決定的。
在啓動實例時,大小爲SGA_MAX_SIZE 的內存就分配給了SGA,SGA成員(buffer cache, share pool等)根據參數值也會獲得相應的內存。
實例啓動後SGA的各成員所用內存之和可以小於SGA_MAX_SIZE。 數據庫管理員通過使用 alter system 命令來調整SGA成員間的內存分配。 當SGA中有足夠多的空閒內存時,增大share pool 或 buffer cache 才能完成,否則會報內存不足。
另外Share pool 和 buffer cache 的尺寸也可動態縮小。 當實例已啓動,SGA已達到 SGA_MAX_SIZE值,可通過先減少某一成員的內存,再增加另一成員的內存來完成。
SGA成員間是相互獨立的,在成員間分配內存時,其和一定不能大於 SGA_MAX_SIZE , 並且db_cache_size 參數不能等於0。
在OLAP與OLTP混合型的應用環境中,利用動態SGA的功能,可以根據不同時刻應用的優先級,來動態的調整buffer cache 和 share pool 的尺寸,以提高系統的性能 :
a. 當OLTP 應用 優先級高時,縮小 buffer cache 的值,增大 share pool 的值;
b. 當 OLAP 應用優先級高時,縮小 share pool 的值,增大buffer cache 的值。
例如:
1. 增大buffer cache 尺寸
SQL> show parameter db_cache_size; 顯示當前 buffer chache 的大小
NAME TYPE VALUE
-------------------------- ----------- -----------------
db_cache_size big integer 4194304
SQL> alter system set db_cache_size=8M; 增大buffer cache 到8MB。
System altered.
SQL> show parameter db_cache_size;
NAME TYPE VALUE
-------------------------- ----------- -----------------
db_cache_size big integer 8388608
2. 調整參數 SGA_MAX_SIZE (需重啓實例)
SQL> alter system set SGA_MAX_SIZE= 1000M scope=spfile;
System altered.
3. 增大shared_pool_size 尺寸
假設,初始參數值爲:
SGA_MAX_SIZE=128M
DB_CACHE_SIZE=88M
SHARED_POOL_SIZE=32M
SQL>ALTER SYSTEM SET SHARED_POOL_SIZE=64M; 設置share_pool 的內存爲64M
Error ORA-04033, insufficient memory
SQL>ALTER SYSTEM SET DB_CACHE_SIZE=56M; 減少buffer cache 的大小
SQL>ALTER SYSTEM SET SHARED_POOL_SIZE=64M;
Error ORA-04033, insufficient memory
需要等 buffer cache 釋放完,纔可擴大 share pool 的大小
SQL> select * from v$buffer_pool ; 檢查內存釋放是否完成。
SQL>ALTER SYSTEM SET SHARED_POOL_SIZE=64M;
System altered.