標籤:oracle assm sga pga
ASMM自動共用記憶體管理:
自動根據工作量變化調整
最大程度地提高記憶體利用率
有助於消除記憶體不足的錯誤
[email protected]>show parameter sga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 1G
sga_target big integer 1G
[email protected]>show parameter memory
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address integer 0
memory_max_target big integer 0
memory_target big integer 0
shared_memory_address integer 0
[email protected]>show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 208M
ASMM 的工作原理 :
ASMM 以 MMON 在後台捕獲的工作量資訊為基礎。
MMON 使用記憶體指導。
將記憶體移到 MMAN 最迫切需要的地方。
如果使用 SPFILE:在關閉時儲存組件大小 、儲存的值用於引導程式組件大小 、無需再確定最佳值
自動共用記憶體管理功能使用由以下兩個後台進程實施的 SGA 記憶體中介:可管理性監視器 (MMON) 和記憶體管理器 (MMAN)。MMON 定期將統計資訊和記憶體指導資料擷取到記憶體中。MMAN 根據 MMON 的決定調整記憶體組件的大小。SGA 記憶體中介會不斷跟蹤組件的大小和待處理的大小調整操作。
SGA 記憶體中介會觀察系統和工作量,以便確定理想的記憶體配置方案。SGA 記憶體中介每隔幾分鐘就執行一次這種檢查,使記憶體始終用在需要的地方。如果沒有自動共用記憶體管理功能,必須分別預計各組件在峰值時的記憶體需求,然後對其記憶體大小進行調整。
在工作量資訊基礎上,自動共用記憶體管理功能會:
定期在後台捕獲統計資訊
使用記憶體指導
進行假設分析,確定最佳記憶體配置方案
將記憶體移到最迫切需要的地方
如果使用了 SPFILE,則在關閉時儲存組件大小(這些大小可以在最後一次關閉前重新起用)
啟用自動共用記憶體管理功能 :
要從手動共用記憶體管理員模式下啟用 ASMM,請執行以下操作:
1.擷取 SGA_TARGET 的值:
SELECT ((SELECT SUM(value) FROM V$SGA) - (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY)) "SGA_TARGET" FROM DUAL;
2.使用該值設定 SGA_TARGET。
3.將自動化佈建大小的 SGA 組件的值設定為 0。
要從自動記憶體管理員模式切換到 ASMM,請執行以下操作:
1.將初始化參數 MEMORY_TARGET 設定為 0。
2.將自動化佈建大小的 SGA 組件的值設定為 0。
自動最佳化的 SGA 參數的行為:
未設定 SGA_TARGET 或將其設定為 0 時:
自動最佳化的參數指定相應組件的實際大小
、可能需要增加 SHARED_POOL_SIZE
SELECT SUM(bytes)/1024/1024 size_mb FROM v$sgastat WHERE pool = ‘shared pool‘;
SGA_TARGET 設定為非零值時:
自動最佳化的參數的預設值為零 、指定的值用作下限大小
SELECT component, current_size/1024/1024 size_mb FROM v$sga_dynamic_components;
手動最佳化的 SGA 參數的行為:
有些組件不能自動最佳化。
--DB_KEEP_CACHE_SIZE 和 DB_RECYCLE_CACHE_SIZE
--非標準塊大小的緩衝區快取,DB_nK_CACHE_SIZE
--
LOG_BUFFER
這些組件必須使用資料庫參數手動設定。
這些組件使用的記憶體會減少可用於自動最佳化 SGA 的記憶體量。
修改 SGA_TARGET 參數 :
--是動態參數
--
最多可增大到 SGA_MAX_SIZE
--可以減小,直到所有組件都達到其下限大小為止
更改 SGA_TARGET 的值只會影響自動調整大小的組件
SGA_TARGET 是一個動態參數,可以通過 Database Control 或使用 ALTER SYSTEM 命令更改。
GA_MAX_SIZE 是可分配給 SGA 的記憶體量的上限。更改該值後,必須重新啟動資料庫才會生效。SGA_TARGET 最多可增大到 SGA_MAX_SIZE 值。它可以減小,直到任一自動最佳化的組件達到其下限大小:使用者指定的下限值或內部確定的下限值。
如果增大 SGA_TARGET 的值,則會根據自動最佳化策略在自動最佳化的組件之間分配增加的那部分記憶體。
如果減小 SGA_TARGET 的值,則這部分記憶體將按照自動最佳化策略從一個或多個自動最佳化的組件處提取。
假定 SGA_MAX_SIZE 設定為 10 GB,SGA_TARGET 設定為 8 GB。如果 DB_KEEP_CACHE_SIZE 設定為 1 GB,並且將 SGA_TARGET 增大為 9 GB,則增加的 1 GB 只會在 SGA_TARGET 控制的組件之間進行分配。DB_KEEP_CACHE_SIZE 的值不受影響。同樣,如果將 SGA_TARGET 減小到 7 GB,則這 1 GB 也只會從 SGA_TARGET 控制的那些組件中提取。這種減少並不會影響手動控制的參數(如 DB_KEEP_CACHE_SIZE)的設定。
禁用 ASMM :
將 SGA_TARGET 設定為 0 可禁用自動最佳化功能。
自動最佳化的參數設定為其當前大小。
SGA 大小總體上不受影響。
eg:
SGA_TARGET 的值為 8 GB,SHARED_POOL_SIZE 的值為 1 GB。如果系統將共用池組件的大小內部調整為 2 GB,則將 SGA_TARGET 設定為 0 會導致 SHARED_POOL_SIZE 被設定為 2 GB,從而覆蓋使用者定義的原始值。
手動調整動態 SGA 參數的大小
對於自動最佳化的參數,手動調整大小會:
導致組件大小立即調整(如果新值大於當前值) 、更改下限大小(如果新值小於當前大小)
調整手動最佳化的參數的大小隻會影響 SGA 的可調部分。
調整了自動最佳化的參數的大小並設定了 SGA_TARGET 值後,只有當新值大於組件的當前大小時,這種調整才會導致組件的大小立即發生更改。例如,如果將 SGA_TARGET 設定為 8 GB,將 SHARED_POOL_SIZE 設定為 2 GB,可確保共用池始終不小於 2 GB,以滿足必要的記憶體配置需求。之後,即使將 SHARED_POOL_SIZE 值調整為 1 GB,也不會對共用池的大小產生直接影響。只會使自動記憶體最佳化演算法以後可以將共用池大小減少到 1 GB(如果需要)。相反,如果共用池的大小最初設定為 1 GB,那麼將 SHARED_POOL_SIZE 值調整為 2 GB 時,共用池組件的大小會立即增加到 2 GB。此大小調整操作中使用的記憶體從一個或多個自動最佳化的組件中提取,手動最佳化的組件的大小不受影響。
手動調整大小的組件的參數也可以動態變更,但不同之處在於,參數的值會立即指定相應組件的精確大小。因此,如果手動調整的組件的大小增大,則增加的那部分記憶體將從一個或多個自動調整大小的組件處提取。如果手動調整的組件的大小減小,則釋放的記憶體將會提供給自動調整大小的組件。
程式全域區 (PGA)
程式全域區 (PGA) 是包含某伺服器處理序的資料及控制資訊的記憶體區。這是 Oracle 伺服器在伺服器處理序啟動時建立的非共用記憶體,只有該伺服器處理序才能訪問。由關聯到某個 Oracle 執行個體的所有伺服器處理序分配的 PGA 總記憶體,也稱為該執行個體分配的聚集 PGA 記憶體。
使用共用伺服器時,部分 PGA 可位於 SGA 中。
PGA 記憶體通常包含以下各項:
專用 SQL 區:
專用 SQL 區包含綁定資訊和運行時記憶體結構等資料。這些資訊是每個會話的 SQL 陳述式調用所特有的;在其它方面,綁定變數有不同的值,遊標的狀態也不同。發出 SQL 陳述式的每個會話都有一個專用 SQL 區。提交同一 SQL 陳述式的每個使用者也都有其自己的專用 SQL 區,該專用 SQL 區使用一個共用 SQL 區。這樣,許多專用 SQL 區可與同一個共用 SQL 區關聯。專用 SQL 區的位置取決於為會話建立的連線類型。如果會話是通過專用伺服器串連的,則專用 SQL 區位於該伺服器處理序的 PGA 中。不過,如果會話是通過共用伺服器串連的,則部分專用 SQL 區將保留在 SGA 中。
遊標和 SQL 區
:
Oracle Pro*C 程式或 Oracle OCI 程式的應用程式開發人員可以顯式開啟特定專用 SQL 區的遊標或控制代碼,並在該程式的整個執行過程中將它們用作命名資源。資料庫為某些 SQL 陳述式隱式發出的遞迴遊標也使用共用 SQL 區。
工作區
:
對於複雜查詢(例如,決策支援查詢),會將大部分 PGA 供記憶體密集型運算子分配的工作區專用,例如:
基於排序的運算子(如 ORDER BY、GROUP BY 和 ROLLUP)和視窗函數
散列聯結
位元影像合并
位元影像建立
批量裝載操作使用的寫緩衝區
排序運算子使用工作區(排序區),對一組行執行記憶體中排序。與此類似,散列聯結運算子使用工作區(散列區),根據其左側輸入內容產生散列表。
工作區的大小是可以控制和最佳化的。通常,較大的工作區可以顯著改進特定運算子的效能,不過代價是消耗較多的記憶體。
會話記憶體
:
會話記憶體是用於存放會話的變數(登入資訊)以及與會話相關的其它資訊的記憶體。對於共用伺服器,會話記憶體是共用的,而不是專用的。
自動 PGA 記憶體管理
根據 PGA_AGGREGATE_TARGET 參數,動態調整供工作區專用的 PGA 記憶體量
有助於最大限度地提高所有記憶體密集型 SQL 操作的效能
預設情況下是啟用的
PGA 管理資源
管理 PGA_AGGREGATE_TARGET 初始化參數的統計資訊,如 PGA 快取命中百分比
可以在下列動態效能檢視中查看有關工作區記憶體配置和使用的統計資訊:
V$SYSSTAT
V$SESSTAT
V$PGASTAT
V$SQL_WORKAREA
V$SQL_WORKAREA_ACTIVE
用於調整 PGA 工作區大小的視圖有:
V$PGA_TARGET_ADVICE
V$PGA_TARGET_ADVICE_HISTOGRAM
V$SQL_WORKAREA_HISTOGRAM
-----------------Oracle DB 記憶體參數
ALTER SYSTEM SET MEMORY_TARGET=300M;
雖然僅需要設定 MEMORY_TARGET 來觸發自動記憶體管理,但仍可以為各種快取設定下限值。因此,如果子參數是使用者佈建的,則這些參數值將是 Oracle DB 伺服器自動最佳化該組件時的下限值。
有效使用記憶體:準則
盡量使 SGA 適合實體記憶體。
最佳化以實現高緩衝區快取命中率,但要注意以下幾點:
--即使有效且必需的全表掃描也會降低命中率。
--可能存在因不必要地重複讀取同一塊而出現命中率虛升的情況。
使用記憶體指導。
庫快取的記憶體最佳化準則:提高命中率
為開發人員制定格式使用約定,以便 SQL 陳述式符合快取的要求。
使用綁定變數。
消除不必要的重複 SQL。
考慮使用 CURSOR_SHARING。
儘可能使用 PL/SQL。
緩衝序號。
串連庫快取中的對象。
Oracle 自動記憶體管理 SGA、PGA 詳解