原文:http://bbs.dameng.com/viewthread.php?tid=2202&extra=page%3D1
PGA是一個服務器進程的專用的私有內存區,而SGA則是共享內存區。
SGA由多個部分組成:
1, 固定SGA(Fixed SGA)
2, 塊緩沖區(Db cache)
3, 重做日志緩沖區(Redo log buffer)
4, Java池(
Java pool)
5, 大池(Large pool)
6, 共享池(Shared pool)
7, 流池(Stream pool)
有如下參數控制共享池相關組件大?。?br />
1, JAVA_POOL_SIZE:控制Java池大小。
2, SHARED_POOL_SIZE:9i中控制共享池中占用最大的部分,10g以上控制共享池大小。
3, LARGE_POOL_SIZE:控制大池大小。
4, DB_*K_CACHE_SIZE:控制不同塊大小的緩沖區大小。
5, LOG_BUFFER:控制重做日志緩沖區大小。
6, SGA_TARGET:10g以上控制自動SGA內存管理的總內存大小。
7, SGA_MAX_SIZE:控制SGA可以達到的最大大小,改變需重啟
數據庫。
下面將詳細介紹各個部分的作用和推薦設置。
SGA各組件作用
1, SGA:
2, 塊緩沖區:
查詢時,Oracle會先把從磁盤讀取的數據放入內存,以后再查詢相關數據時不用再次讀取磁盤。insert和update時,Oracle SGA會現在該區中緩存數據,之后批量寫到硬盤中。通過塊緩沖區,
Oracle可以通過內存緩存提高磁盤的I/O。
塊緩沖區中有三個區域:
默認池(Default pool):所有數據默認都在這里緩存。
保持池(Keep pool):用來緩存需要多次重用的數據。
回收池(Recycle pool):用來緩存很少重用的數據。
原來只有一個默認池,所有數據都在這里緩存。這樣會產生一個問題:大量很少重用的數據會把需重用的數據緩沖區,造成磁盤I/O增加,運行速度下降。后來分出了保持池和回收池根據是
否經常重用來分別緩存數據。
這三部分內存區需要手動確定大小,并且之間沒有共享。例如:保持池中已經滿了,而回收池中還有大量空閑內存,這時回收池的內存不會分配給保持池。
9i開始,還可以設置db_nk_cache。9i之前數據庫只能使用相同的塊大小。9i開始同一個數據庫可以使用多種塊大小(2KB,4KB,8KB,16KB,32KB),這些塊需要在各自的db_nk_cache中緩存。如果為不
同的表空間指定了不同的塊大小,需要為其設置各自的緩沖區。
3, 重做日志緩沖區(Redo log buffer):
數據寫到重做日志文件之前在這里緩存,在以下情況中觸發:
每隔3秒
緩存達到1MB或1/3滿時
用戶提交時
緩沖區的數據寫入磁盤前
4, Java池(Java pool):
在數據庫中運行Java代碼時用到這部分內存。例如:編寫Java存儲過程在服務器內運行。需要注意的是,該內存與常見的Java編寫的B/S系統并沒關系。用JAVA語言代替PL/SQL語言在數據庫中寫存儲
過程才會用到這部分內存。
5, 大池(Large pool):
下面三種情況使用到大池:
并行執行:存放進程間的消息緩沖區
RMAN:某些情況下用于磁盤I/O緩沖區
共享服務器模式:共享服務器模式下UGA在大池中分配(如果設置了大池)
6, 共享池(Shared pool)
共享池是SGA中最重要的內存段之一。共享池太大和太小都會嚴重影響服務器。
SQL和PL/SQL的解釋計劃、代碼,數據字典數據等等都在這里緩存。
SQL和PL/SQL代碼在執行前會進行“解析”來獲得執行計劃及權限驗證等相關輔助操作。“解析”很費時間。對于響應時間很短的查詢,“解析”可以占到全部時間的2/3。對于響應時間較長的統計等操
作,“解析”所占用的時間比例會下降很多。執行計劃及所需的數據字典數據都緩存在共享池中,讓后續相同的查詢可以減少很多時間。
不使用“綁定變量”導致:
系統需要花費大量的資源去解析查詢。
共享池中的代碼從不重用,系統花費很大代價管理這部分內存。
關于共享變量的優缺點討論已經超過了這篇文章的范疇,簡單來講,響應時間短的查詢要使用共享變量,響應時間長的統計不使用共享變量。
需要注意的是,SHARED_POOL_SIZE參數在9i中控制共享池中占用最大的部分,10g以上控制共享池總大小。
7, 流池(Stream pool)
9iR2以上增加了“流”技術,10g以上在SGA中增加了流池。流是用來共享和復制數據的工具。