Oracle 自己主动内存管理 SGA、PGA 具体解释
ASMM自己主動共享內存管理:
自己主動依據工作量變化調整
最大程度地提高內存利用率
有助于消除內存不足的錯誤
?
SYS@PROD>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
SYS@PROD>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
SYS@PROD>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) 是包括某server進程的數據及控制信息的內存區。這是 Oracle server在server進程啟動時創建的非共享內存,僅僅有該server進程才干訪問。
由關聯到某個 Oracle 實例的全部server進程分配的 PGA 總內存,也稱為該實例分配的聚集 PGA 內存。
?
使用共享server時,部分 PGA 可位于 SGA 中。
PGA 內存通常包括下面各項:
專用 SQL 區:
專用 SQL 區包括綁定信息和執行時內存結構等數據。這些信息是每一個會話的 SQL 語句調用所特有的。在其他方面,綁定變量有不同的值,游標的狀態也不同。發出 SQL 語句的每一個會話都有一個專用 SQL 區。提交同一 SQL 語句的每一個用戶也都有其自己的專用 SQL 區,該專用 SQL 區使用一個共享 SQL 區。這樣,很多專用 SQL 區可與同一個共享 SQL 區關聯。專用 SQL 區的位置取決于為會話建立的連接類型。
假設會話是通過專用server連接的。則專用 SQL 區位于該server進程的 PGA 中。只是,假設會話是通過共享server連接的,則部分專用 SQL 區將保留在 SGA 中。?
游標和 SQL 區
:
Oracle Pro*C 程序或 Oracle OCI 程序的應用程序開發者能夠顯式打開特定專用 SQL 區的游標或句柄,并在該程序的整個運行過程中將它們用作命名資源。數據庫為某些 SQL 語句隱式發出的遞歸游標也使用共享 SQL 區。
工作區
:
對于復雜查詢(比如。決策支持查詢),會將大部分 PGA 供內存密集型運算符分配的工作區專用,比如:
基于排序的運算符(如 ORDER BY、GROUP BY 和 ROLLUP)和窗體函數
散列聯接
位圖合并
位圖創建
批量裝載操作使用的寫緩沖區
排序運算符使用工作區(排序區),對一組行運行內存中排序。與此類似,散列聯接運算符使用工作區(散列區),依據其左側輸入內容生成散列表。
工作區的大小是能夠控制和優化的。通常,較大的工作區能夠顯著改進特定運算符的性能,只是代價是消耗較多的內存。?
會話內存
:
會話內存是用于存放會話的變量(登錄信息)以及與會話相關的其他信息的內存。
對于共享server,會話內存是共享的。而不是專用的。
自己主動 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 server自己主動優化該組件時的下限值。
?
有效使用內存:準則
盡量使 SGA 適合物理內存。
優化以實現高緩沖區快速緩存命中率。但要注意下面幾點:
--即使有效且必需的全表掃描也會減少命中率。
--可能存在因不必要地反復讀取同一塊而出現命中率虛升的情況。
使用內存指導。
?
庫快速緩存的內存優化準則:提高命中率
為開發者制定格式使用約定,以便 SQL 語句符合快速緩存的要求。
使用綁定變量。
消除不必要的反復 SQL。
考慮使用 CURSOR_SHARING。
盡可能使用 PL/SQL。
緩存序列號。
連接庫快速緩存中的對象。
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的Oracle 自己主动内存管理 SGA、PGA 具体解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于css的一些特别用法
- 下一篇: (转)SpringMVC学习(三)——S