Oracle記憶體結構研究-SGA篇
一、概述
在《Oracle記憶體結構研究-PGA篇》一文中提到,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)
有如下引數控制共享池相關元件大小:
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:
顧名思義,是一段不變的記憶體區,指向SGA中其他部分,Oracle通過它找到SGA中的其他區,可以簡單理解為用於管理的一段記憶體區。
2, 塊緩衝區:
查詢時,Oracle會先把從磁碟讀取的資料放入記憶體,以後再查詢相關資料時不用再次讀取磁碟。插入和更新時,Oracle會現在該區中快取資料,之後批量寫到硬碟中。通過塊緩衝區,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中增加了流池。流是用來共享和複製資料的工具。
三、SGA設定
沒有通用的設定,所有設定都要根據系統的負載、業務需求和硬體環境來進行調整。這裡只是總結出大體的設定,避免因SGA設定不當引起的問題。
1,自動SGA記憶體管理
在Oracle 10g中引入了自動SGA記憶體管理特性,DBA可以設定SGA_TARGET告訴Oracle可用的SGA記憶體為多大,由Oracle根據系統負載來動態調整各元件大小,相應的數定會儲存在控制檔案中,使資料庫重啟後也記得各元件大小。
需要注意一下幾點:
要使用自動SGA記憶體管理,STATISTICS_LEVEL引數必須設為TYPICAL或ALL,系統自動收集相應的資訊用來動態調整SGA設定。
可以設定某個元件的值,Oracle使用此值為該元件的最小大小
可動態調整的引數:
DB_CACHE_SIZE,SHARED_POOL_SIZE,LARGE_POOL_SIZE,JAVA_POOL_SIZE。
需手動設定的引數:
LOG_BUFFER,STREAMS_POOL,DB_NK_CACHE_SIZE,DB_KEEP_CACHE_SIZE,DB_RECYCLE_CACHE_SIZE。
2,手動SGA記憶體管理
1) 32bit和64bit限制
在32位的作業系統中,Oracle最大可用記憶體為1.75g,也就是說SGA+PGA<=1.75g,超過這一限制的記憶體將不會被Oracle用到。
32位的Oracle可以裝到64位的作業系統上,64位的Oracle不可以裝到32位的作業系統上。
2) 檢視Oracle版本:
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 – Production
3) 各元件設定:
JAVA_POOL_SIZE:如果沒用到資料庫端java的系統,30MB足夠。
LOG_BUFFER:預設為MAX(512KB,128KB*CPU個數)。一般系統1MB足夠,執行大型事務的系統可以設為2MB,讓1/3滿寫入日誌檔案時可以繼續寫入緩衝,再大也沒有意義。
SHARED_POOL_SIZE:過大過小都會嚴重影響系統效能,1GB記憶體可以設為100MB,2GB記憶體可設為150MB,4GB記憶體可設為300MB。共享池命中過低首先要調整的是應用程式而不是擴大共享池。使用繫結變數可以減少共享池需求、提高命中率,減少共享池管理負擔和LATCH競爭。
LARGE_POOL_SIZE:使用專用服務模式可設為30MB,除非必要,不然不建議使用共享伺服器模式。
DB_CACHE_SIZE:除去上述記憶體外其他可用記憶體都分配給該區域。
總結
32位Oracle:
1G記憶體:SHARED_POOL_SIZE=100MB,DB_CACHE_SIZE=0.5GB;
2G記憶體:SHARED_POOL_SIZE=150MB,DB_CACHE_SIZE=1.25GB;
64位Oracle
4G記憶體:SHARED_POOL_SIZE=200MB,DB_CACHE_SIZE=2.5GB;
8G記憶體:SHARED_POOL_SIZE=400MB,DB_CACHE_SIZE=5GB;
12G記憶體:SHARED_POOL_SIZE=500MB,DB_CACHE_SIZE=8GB
再次強調,以上只是避免因SGA設定不當引起問題的大體設定,需要根據具體的系統負載和業務邏輯結合Stackpack等工具細調。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10113559/viewspace-617345/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle記憶體結構研究-PGA篇Oracle記憶體
- Oracle體系結構之記憶體結構(SGA、PGA)Oracle記憶體
- oracle記憶體結構:SGA的區域資訊Oracle記憶體
- Oracle記憶體結構(一)----SGA的區域資訊Oracle記憶體
- Oracle記憶體結構(一)----SGA的區域資訊(轉)Oracle記憶體
- 【基礎篇記憶體結構】oracle10g記憶體結構(一)記憶體Oracle
- Oracle面試寶典-記憶體結構篇Oracle面試記憶體
- oracle 記憶體結構Oracle記憶體
- ORACLE 記憶體管理 之四 SGAOracle記憶體
- 記憶體_SGA記憶體
- Oracle體系結構之-記憶體結構Oracle記憶體
- Oracle記憶體體系結構Oracle記憶體
- oracle 記憶體結構(二)Oracle記憶體
- Oracle 記憶體結構(一)Oracle記憶體
- ORACLE 記憶體結構理解.Oracle記憶體
- SGA系統全域性區記憶體結構瞭解記憶體
- oracle 例項記憶體結構Oracle記憶體
- oracle記憶體結構與管理Oracle記憶體
- Oracle體系結構:記憶體結構和程式結構(轉)Oracle記憶體
- oracle 記憶體結構具體解釋Oracle記憶體
- Oracle 體系結構 SGA 和PGA 總結Oracle
- Oracle OCP(39):Database 記憶體結構OracleDatabase記憶體
- Oracle中Buffer Cache記憶體結構Oracle記憶體
- SGA與共享記憶體記憶體
- oracle體系結構梳理---SGA+PGAOracle
- 記憶體結構記憶體
- Oracle例項的程式結構和記憶體結構Oracle記憶體
- Oracle Exadata與SGA快取記憶體CQOracle快取記憶體
- oracle例項記憶體(SGA和PGA)調整Oracle記憶體
- oracle資料庫記憶體分配(sga和pga)Oracle資料庫記憶體
- 【SGA】【PGA】普適的Oracle記憶體分配策略Oracle記憶體
- Oracle - 資料庫的記憶體結構Oracle資料庫記憶體
- SGA和PGA記憶體管理記憶體
- SGA與共享記憶體2記憶體
- ORACLE例項的程式結構和記憶體結構(轉)Oracle記憶體
- PostgreSQL:記憶體結構SQL記憶體
- JVM記憶體結構JVM記憶體
- Memory Dumps(ORACLE記憶體結構轉儲)Oracle記憶體