Oracle記憶體結構研究-SGA篇

csbwolf10發表於2009-10-24

一、概述
在《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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章