1. 程式人生 > >對oracle例項的記憶體(SGA和PGA)進行調整,優化資料庫性

對oracle例項的記憶體(SGA和PGA)進行調整,優化資料庫性

一、名詞解釋

(1)SGA:SystemGlobal Area是OracleInstance的基本組成部分,在例項啟動時分配;系統全域性域SGA主要由三部分構成:共享池、資料緩衝區、日誌緩衝區。
(2)共享池:Shared Pool用於快取最近被執行的SQL語句和最近被使用的資料定義,主要包括:Librarycache(共享SQL區)和Datadictionarycache(資料字典緩衝區)。 共享SQL區是存放使用者SQL命令的區域,資料字典緩衝區存放資料庫執行的動態資訊。
(3)緩衝區快取記憶體:DatabaseBufferCache用於快取從資料檔案中檢索出來的資料塊,可以大大提高查詢和更新資料的效能。
(4)大型池:Large Pool是SGA中一個可選的記憶體區域,它只用於shared server環境。
(5)Java池:Java Pool為Java命令的語法分析提供服務。
(6)PGA:ProcessGlobal Area是為每個連線到Oracledatabase的使用者程序保留的記憶體。
二、分析與調整

(1)系統全域性域:

SGA與作業系統、記憶體大小、cpu、同時登入的使用者數有關。可佔OS系統實體記憶體的1/3到1/2。

a.共享池Shared Pool:

檢視共享池大小Sql程式碼

SQL>show parameter shared_pool_size
檢視共享SQL區的使用率:

Sql程式碼
select(sum(pins-reloads))/sum(pins)”Library cache”from v$librarycache;

–動態效能表

LIBRARY命中率應該在90%以上,否則需要增加共享池的大小。

檢視資料字典緩衝區的使用率:

Sql程式碼

select(sum(gets-getmisses-usage-fixed))/sum(gets)”Data dictionary cache”from v$rowcache;

–動態效能表
這個使用率也應該在90%以上,否則需要增加共享池的大小。

修改共享池的大小:

Sql程式碼

ALTERSYSTEMSET SHARED_POOL_SIZE =64M;
b.緩衝區快取記憶體DatabaseBufferCache:

檢視共享池大小Sql程式碼

SQL>show parameter db_cache_size

檢視資料庫資料緩衝區的使用情況:

Sql程式碼

SELECTname,valueFROM v$sysstat orderbynameWHEREnameIN(”DBBLOCK GETS”,”CONSISTENT GETS”,”PHYSICALREADS”);

SELECT * FROM V$SYSSTAT WHERENAMEIN(‘parse_time_cpu’,’parse_time_elapsed’,’parse_count_ hard’);

計算出來資料緩衝區的使用命中率=1-(physicalreads/(dbblock gets+consistent gets)),這個命中率應該在90%以上,否則需要增加資料緩衝區的大小。

c.日誌緩衝區

檢視日誌緩衝區的使用情況:

Sql程式碼

SELECTname,valueFROM v$sysstat WHEREnameIN(‘redo entries’,’redo log space requests’)

查詢出的結果可以計算出日誌緩衝區的申請失敗率:

申請失敗率=requests/entries,申請失敗率應該接近於0,否則說明日誌緩衝區開設太小,需要增加ORACLE資料庫的日誌緩衝區。

d.大型池:

可以減輕共享池的負擔,可以為備份、恢復等操作來使用,不使用LRU演算法來管理。其大小由資料庫的’共享模式/db模式’如果是共享模式的話,要分配的大一些。

指定Large Pool的大小:

Sql程式碼

ALTERSYSTEMSET LARGE_POOL_SIZE=64M

e.Java池:

在安裝和使用Java的情況下使用。

(2)PGA調整

a.PGA_AGGREGATE_TARGET初始化設定

PGA_AGGREGATE_TARGET的值應該基於Oracle例項可利用記憶體的總量來設定,這個引數可以被動態的修改。假設Oracle例項可分配4GB的實體記憶體,剩下的記憶體分配給作業系統和其它應用程式。你也許會分配80%的可用記憶體給Oracle例項,即3.2G。現在必須在記憶體中劃分SGA和PGA區域。

在OLTP(聯機事務處理)系統中,典型PGA記憶體設定應該是總記憶體的較小部分(例如20%),剩下80%分配給SGA。

OLTP:PGA_AGGREGATE_TARGET=(total_mem * 80%) * 20%=2.5G

在DSS(資料集)系統中,由於會執行一些很大的查詢,典型的PGA記憶體最多分配70%的記憶體。

DSS:PGA_AGGREGATE_TARGET=(total_mem * 80%) * 50%

在這個例子中,總記憶體4GB,DSS系統,你可以設定PGA_AGGREGATE_TARGET為1600MB,OLTP則為655MB。

b.配置PGA自動管理
不用重啟DB,直接線上修改。
SQL>altersystemset workarea_size_policy=autoscope=both;
System altered.
SQL>altersystemset pga_aggregate_target=512mscope=both;
System altered.
SQL>show parameter workarea

NAME TYPE VALUE

workarea_size_policy string AUTO –這個設定成AUTO

SQL>show parameter pga

NAME TYPE VALUE

pga_aggregate_target big integer 500M

c.監控自動PGA記憶體管理的效能

V$PGASTAT:這個檢視給出了一個例項級別的PGA記憶體使用和自動分配的統計。

SQL>set lines 256

SQL>set pages 42

SQL>SELECT * FROM V$PGASTAT;

NAMEVALUE UNIT

aggregate PGA target parameter536870912 bytes

–當前PGA_AGGREGATE_TARGET的值

aggregate PGAauto target 477379584 bytes

–當前可用於自動分配了的PGA大小,應該比PGA_AGGREGATE_TARGET小

globalmemorybound26843136 bytes

–自動模式下工作區域的最大大小,Oracle根據工作負載自動調整。

total PGA inuse6448128 bytes

total PGA allocated11598848 bytes

–PGA的最大分配

maximum PGA allocated166175744 bytes

total freeable PGAmemory393216 bytes

–PGA的最大空閒大小

PGAmemory freed back to OS 69074944 bytes

total PGA usedforauto workareas 0 bytes

–PGA分配給auto workareas的大小

maximum PGA usedforauto workareas 1049600 bytes

total PGA usedformanual workareas 0 bytes

maximum PGA usedformanual workareas 530432 bytes

over allocation count1118

–例項啟動後,發生的分配次數,如果這個值大於0,就要考慮增加pga的值

bytes processed114895872 bytes

extra bytesread/written4608000 bytes

cache hit percentage 96.14percent

–命中率

16rows selected.

–V$PGA_TARGET_ADVICE

SQL>SELECTround(PGA_TARGET_FOR_ESTIMATE/1024/1024) target_mb,

ESTD_PGA_CACHE_HIT_PERCENTAGE cache_hit_perc,

ESTD_OVERALLOC_COUNT

FROM v$pga_target_advice;
The output of this query might look likethefollowing:

TARGET_MB CACHE_HIT_PERC ESTD_OVERALLOC_COUNT

6323367

1252430

250303

375390

500580

600590

700590

800600

900600

1000610

1500670

2000760

3000830

4000850

可以看出當TARGET_MB為375M是ESTD_OVERALLOC_COUNT=0,所以可以將PGA_AGGREGATE_TARGET設定成375M。

附:oracle SGA與PGA區別:

SGA:是用於儲存資料庫資訊的記憶體區,該資訊為資料庫程序所共享。它包含Oracle伺服器的資料和控制資訊,它是在Oracle伺服器所駐留的計算機的實際記憶體中得以分配,如果實際記憶體不夠再往虛擬記憶體中寫。

PGA:包含單個伺服器程序或單個後臺程序的資料和控制資訊,與幾個程序共享的SGA正相反,PGA是隻被一個程序使用的區域,PGA在建立程序時分配,在終止程序時回收。

另一篇文章中也這樣寫了相關的調整記錄

如何估算PGA,SGA的大小,配置資料庫伺服器的記憶體

ORACLE給的建議是: OLTP系統PGA=(TotalMemory)*80%*20%。

DSS系統PGA=(TotalMemory)*80%*50%。

ORACLE建議一個數據庫伺服器,分80%的記憶體給資料庫,20%的記憶體給作業系統,那怎麼給一個數據庫伺服器配記憶體呢?

SQL>select * from v$pgastat;

NAMEVALUE UNIT

aggregate PGA target parameter104857600 bytes

—–這個值等於引數PGA_AGGREGATE_TARGET的值,如果此值為0,表示禁用了PGA自動管理。

aggregate PGAauto target 75220992 bytes

—–表示PGA還能提供多少記憶體給自動執行模式,通常這個值接近pga_aggregate_target-total pga inuse.

globalmemorybound20971520 bytes

—–工作區執行的最大值,如果這個值小於1M,馬上增加PGA大小

total PGA inuse30167040 bytes

—–當前分配PGA的總大小,這個值有可能大於PGA,如果PGA設定太小.這個值接近select sum(pga_used_mem) from v$process.

total PGA allocated52124672 bytes

—–工作區花費的總大小

maximum PGA allocated67066880 bytes

total freeable PGAmemory0 bytes —-沒有了空閒的PGA

processcount23—-當前一個有23個process

max processes count25

PGAmemory freed back to OS 0 bytes

total PGA usedforauto workareas 8891392 bytes

maximum PGA usedforauto workareas 22263808 bytes

total PGA usedformanual workareas 0 bytes —為0自動管理

maximum PGA usedformanual workareas 0 bytes —為0自動管理

over allocation count0

–如果PGA設定太小,導致PGA有時大於PGA_AGGREGATE_TARGET的值,此處為0,說明PGA沒有擴充套件大於TARGET的值,如果此值出現過,那麼增加PGA大小。

bytes processed124434432 bytes

extra bytesread/written0 bytes

cache hit percentage 100percent

—命中率為100%,如果太小增加PGA

recomputecount(total)6651

19rows selected

SQL>selectmax(pga_used_mem)/1024/1024Mfrom v$process;

—-當前一個process消耗最大的記憶體

M

9.12815189

SQL>selectmin(pga_used_mem)/1024/1024Mfrom v$process where pga_used_mem>0;—process消耗最少記憶體

M

0.19186878

SQL>selectmax(pga_used_mem)/1024/1024Mfrom v$process ;

—-process曾經消耗的最大記憶體

M

9.12815189

SQL>selectsum(pga_used_mem)/1024/1024from v$process;—-當前process一共消耗的PGA

SUM(PGA_USED_MEM)/1024/1024

28.8192501068115

如何設定PGA呢?我們可以在壓力測試階段,模擬一下系統的執行,然後執行

select(selectsum(pga_used_mem)/1024/1024from vprocess)/(selectcount()fromvprocess)fromdual;

得到一個process大約佔用了多少的記憶體,然後估算系統一共會有多少連線,比如一共有500個連線,

那麼sessions=1.1*process+5=500,那麼processes=450,

再乘以一個process需要消耗的記憶體,就能大約估算出PGA需要設定多大。

EG = 1.1 * 450 = 495M估算的大一點550M就OK樂

最好將PGA設定的值比計算出的值大一點,PGA值設定好後,就可以根據系統的性質,如果系統為OLTOP,那麼總的記憶體可以設定為PGA/0.16,最後也能估算出SGA的大小,建議還是多配點記憶體,反正便宜。

下面摘抄eygle的關於一個process能夠分配的最大記憶體(序列操作)的規則:

10gR1之前,對於序列操作(非並行)一個process能夠分配的最大的記憶體為min(5%pga_aggregate_target,100m)

10gR2之後,對於序列操作(非並行)一個process能夠分配的最大記憶體有如下規則:

如果pga_aggregate_target<=500m,那麼最大的記憶體為20%*pga_aggregate_target.

如果500m