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記憶體結構(一)----SGA的區域資訊(轉)Oracle記憶體
- Oracle面試寶典-記憶體結構篇Oracle面試記憶體
- Oracle Exadata與SGA快取記憶體CQOracle快取記憶體
- Oracle OCP(39):Database 記憶體結構OracleDatabase記憶體
- Oracle - 資料庫的記憶體結構Oracle資料庫記憶體
- 記憶體結構記憶體
- oracle12c之 控制pdb中sga 與 pga 記憶體使用Oracle記憶體
- Oracle記憶體結構(四)----如何獲得Oracle各記憶體段的內部資訊(轉)Oracle記憶體
- JVM記憶體結構JVM記憶體
- PostgreSQL:記憶體結構SQL記憶體
- 結構體記憶體對齊結構體記憶體
- JVM記憶體管理——總結篇JVM記憶體
- 【MEMORY】Oracle記憶體結構資源常用檢視及sqlOracle記憶體SQL
- MySQL整體架構與記憶體結構MySql架構記憶體
- 【JVM之記憶體與垃圾回收篇】JVM與Java體系結構JVM記憶體Java
- Oracle記憶體結構(三)----Process Memory的詳細資訊(轉)Oracle記憶體
- Oracle記憶體結構(二)----Shared Pool的詳細資訊(轉)Oracle記憶體
- JVM記憶體結構劃分JVM記憶體
- JVM(七):JVM記憶體結構JVM記憶體
- 理解JVM(一):記憶體結構JVM記憶體
- JVM記憶體結構、Java記憶體模型和Java物件模型JVM記憶體Java模型物件
- Postgresql資料庫體系結構-程式和記憶體結構SQL資料庫記憶體
- 垃圾回收與記憶體分配——總結篇記憶體
- JVM的基本結構和JVM的記憶體結構JVM記憶體
- JVM及其記憶體結構劃分JVM記憶體
- JVM之記憶體結構詳解JVM記憶體
- JVM學習(一)——記憶體結構JVM記憶體
- 記憶體管理篇——實體記憶體的管理記憶體
- C++ struct結構體記憶體對齊C++Struct結構體記憶體
- c 結構體記憶體對齊詳解結構體記憶體
- Oracle體系結構學習筆記Oracle筆記
- STM32記憶體結構介紹和FreeRTOS記憶體分配技巧記憶體
- iOS 記憶體管理研究iOS記憶體
- 瀚高資料庫記憶體結構資料庫記憶體
- Redis 雜湊結構記憶體模型剖析Redis記憶體模型
- 記憶體?java模型?jvm結構?一篇文章讓你全部看懂!記憶體Java模型JVM
- JVM讀書筆記之java記憶體結構JVM筆記Java記憶體
- 淺談JVM記憶體結構 和 Java記憶體模型 和 Java物件模型JVM記憶體Java模型物件
- 【JVM】堆體系結構及其記憶體調優JVM記憶體