一、SGA和PGA初始值到底該設置成多大
1.下面是官方的建議
■For OLTP , the PGA for a small of the total (for , 20%), 80% for the SGA.
■For DSS large, - , PGA can use up to 70% of the .
50% of the to the PGA, and 50% to the SGA. , the value of the for a DSS can be as:
2.初始建庫建議計算公式
(1)OLTP系統:
SGA_TARGET = (total_mem * 0.8) * 0.8 ------物理總內存20%保留給操作系統,即(1-0.2)*0.8,剩余內存的80%分配給SGA區。
PGA_AGGREGATE_TARGET=(total_mem * 0.8) * 0.2----物理總內存20%保留給操作系統,剩余內存的20%分給PGA區。
(2)OLAP(DSS)系統:
SGA_TARGET= (total_mem * 0.8) * 0.5
PGA_AGGREGATE_TARGET =(total_mem * 0.8) * 0.5
3.上線后調整值參考
上面的一切初始建議值,都是在上線前的最佳配置建議值,在上線運行一段時間后,系統運行特性真面目就慢慢的體現出來了,這時,就應該根據運行實際需求及時的調整與的值了。
的實際需求建議值,可以參考**V$**
的實際需求建議值,可以參考**V$視圖**
5.簡單來說
SGA的大小:一般物理內存20%用作操作系統保留,其他80%用于數據庫。
SGA普通數據庫可以分配40%-60%之間,PGA可以分配20%-40%之間。
二、修改SGA和PGA步驟:
1、以的身份登錄
并查看SGA信息:
SQL>show parameter sga;
查看PGA信息:
SQL>show parameter pga;
2、修改
SQL>alter system set sga_target=20000M scope=spfile;
3、修改
SQL> alter system set sga_max_size=5000M scope=spfile;
4、重啟數據庫使其生效:
SQL>shutdown immediate;
注意,重啟前一定先完成上述兩部操作,且不得大于,一般保持兩者相等。否則可能導致數據庫無法啟動,如果為PGA保存的虛擬內存太少就會導致ORA-4030的錯誤。
SQL>startup
5.查看SGA是否生效:
SQL>show parameter sga
6、如果是RAC環境,需要這樣增加sid=’*’:
alter system set sga_target=20G scope=spfile sid='*';
sql>alter system set db_cache_size= 大小M scope=spfile sid='數據庫SID';
7,修改PGA的自動管理方式和大小
SQL> alter system set workarea_size_policy=auto scope=both;
SQL> alter system set pga_aggregate_target=3072m scope=both;
修改后重啟數據庫。
–當前可用于自動分配了的PGA大小,應該比 小
附: SGA與PGA區別:
SGA:是用于存儲數據庫信息的內存區,該信息為數據庫進程所共享。它包含服務器的數據和控制信息,它是在服務器所駐留的計算機的實際內存中得以分配,如果實際內存不夠再往虛擬內存中寫。
PGA:包含單個服務器進程或單個后臺進程的數據和控制信息,與幾個進程共享的SGA正相反,PGA是只被一個進程使用的區域,PGA在創建進程時分配,在終止進程時回收。
一、名詞解釋
(1)SGA: Area是的基本組成部分,在實例啟動時分配;系統全局域SGA主要由三部分構成:共享池、數據緩沖區、日志緩沖區。
(2)共享池: Pool用于緩存最近被執行的SQL語句和最近被使用的數據定義,主要包括:(共享SQL區)和(數據字典緩沖區)。 共享SQL區是存放用戶SQL命令的區域,數據字典緩沖區存放數據庫運行的動態信息。
(3)緩沖區高速緩存:用于緩存從數據文件中檢索出來的數據塊日志記錄緩沖區多大好,可以大大提高查詢和更新數據的性能。
(4)大型池:Large Pool是SGA中一個可選的內存區域,它只用于 環境。
(5)Java池:Java Pool為Java命令的語法分析提供服務。
(6)PGA: Area是為每個連接到的用戶進程保留的內存。
二、分析與調整
(1)系統全局域:
SGA與操作系統、內存大小、cpu、同時登錄的用戶數有關??烧糘S系統物理內存的1/3到1/2。
a.共享池 Pool:
查看共享池大小Sql代碼
SQL>show
查看共享SQL區的使用率:
Sql代碼
select(sum(pins-reloads))/sum(pins)"Library cache"from v$librarycache;
–動態性能表
命中率應該在90%以上,否則需要增加共享池的大小。
查看數據字典緩沖區的使用率:
Sql代碼
select(sum(gets-getmisses-usage-fixed))/sum(gets)"Data dictionary cache"from v$rowcache;
–動態性能表
這個使用率也應該在90%以上,否則需要增加共享池的大小。
修改共享池的大小:
Sql代碼
ALTERSYSTEMSET SHARED_POOL_SIZE =64M;
b.緩沖區高速緩存:
查看共享池大小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-(/( gets+ gets)),這個命中率應該在90%以上日志記錄緩沖區多大好,否則需要增加數據緩沖區的大小。
c.日志緩沖區
查看日志緩沖區的使用情況:
Sql代碼
SELECTname,valueFROM v$sysstat WHEREnameIN('redo entries','redo log space requests')
查詢出的結果可以計算出日志緩沖區的申請失敗率:
申請失敗率=/,申請失敗率應該接近于0,否則說明日志緩沖區開設太小,需要增加數據庫的日志緩沖區。
d.大型池:
可以減輕共享池的負擔,可以為備份、恢復等操作來使用,不使用LRU算法來管理。其大小由數據庫的’共享模式/db模式’如果是共享模式的話,要分配的大一些。
指定Large Pool的大小:
Sql代碼
ALTERSYSTEMSET LARGE_POOL_SIZE=64M
e.Java池:
在安裝和使用Java的情況下使用。
(2)PGA調整
a.初始化設置
的值應該基于實例可利用內存的總量來設置,這個參數可以被動態的修改。
假設Oracle實例可分配4GB的物理內存,剩下的內存分配給操作系統和其它應用程序。你也許會分配80%的可用內存給Oracle實例,即3.2G?,F在必須在內存中劃分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
NAME TYPE VALUE
AUTO --這個設置成AUTO
SQL>show pga
NAME TYPE VALUE
big 500M
c.監控自動PGA內存管理的性能
V$:這個視圖給出了一個實例級別的PGA內存使用和自動分配的統計。
SQL>set lines 256
SQL>set pages 42
SQL>SELECT * FROM V$PGASTAT;
UNIT
PGA 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;
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
下面摘抄eygle的關于一個process能夠分配的最大內存(串行操作)的規則:
10gR1之前,對于串行操作(非并行)一個process能夠分配的最大的內存為min(5%pga_aggregate_target,100m)
10gR2之后,對于串行操作(非并行)一個process能夠分配的最大內存有如下規則:
如果pga_aggregate_target<=500m,那么最大的內存為20%*pga_aggregate_target.
如果500m2.5G,那么最大內存為2.5G.
SQL>SELECT x.ksppinmNAME, y.ksppstvlVALUE, x.ksppdesc describ
FROM SYS.x$ksppi x, SYS.x$ksppcv y WHERE x.inst_id=USERENV('Instance')
AND y.inst_id=USERENV('Instance')AND x.indx= y.indxAND x.ksppinmLIKE'%&par%'
SGA與PGA的結構如下圖:
SGA:
查看SGA:
Sqlp>show sga
或select * from v$sga;
Area bytes
bytes
8 bytes
bytes
Redo bytes
:包括了數據庫與實例的控制信息、狀態信息、字典信息等,啟動時就被固定在SGA中,不會改變。
:包括了shard pool、large pool、java pool、 pool、游標區和其他結構
:數據庫中數據塊緩沖的地方,是SGA中最大的地方,決定數據庫性能
Redo :提供REDO緩沖的地方,在OLAP中不需要太大
V$記錄了SGA的一些統計信息
V$ts保存SGA中可以手動調整的區域的一些調整記錄
Shard pool:
決定其大小,10g以后自動管理
中數據字典和控制區結構用戶無法直接控制,與用戶有關的只有sql緩沖區()。
將經常訪問的過程或包用.KEEP存儲過程將該包pin在共享池中。
手工清除共享池的內容: ;
共享池相關的幾個常用的視圖:
V$記錄了所有sql的統計信息,包括執行次數、物理讀、邏輯讀、耗費時間等
V$完全顯示sql語句,通過來標示語句,piece排序
V$保存了sql的執行計劃,通過工具查看
V$對共享池的預測,可以做調整SGA的參考
:
在OLTP系統中要求的命中率在95%以上
(pins)“”,sum()“hits”,
((sum()/sum(pins))*100)“”,
sum()“”,((sum(pins)/(sum(pins)
+sum()))*100)“”
from V$
計算命中率的語句
round((1 - (.value - .value - lobs.value)/.value)*100,2) “ Cache Hit Ratio”
from , ,, ,, lobs,,
where .name =‘ reads’
and .name =‘ reads ’
and lobs.name =‘ reads (lob)’
and .name =‘ reads’;
times a PIN was for of this
f times were
PIN of an that PIN since was ,and which disk
把從中獲得的數據庫叫cache hit,把從磁盤獲得的腳cache miss
數據緩沖區中的數據塊通過臟列表()和LRU列表()來管理。
可細分為: pool、keep pool、 pool對應的參數為、、分別表示緩沖區大小
從9i開始支持不同塊大小的表空間,相應的可以為不同塊大小的表空間指定不同塊大小的數據緩沖區,不同塊大小的數據緩沖區可以用相應的來指定,其中n可以是2、4、6、16或32
V$對數據緩沖區的預測,可以做調整的參考
Vbh、xbh、xbh、xbh記錄了數據塊在中緩沖的情況,通過這個視圖可以找系統中的熱點塊。
通過下面語句找系統中top10熱點快所在的熱點對象:
/+ rule/ owner,
Where in
( obj from
( obj from x$bh tch desc)
PGA:
用來保存于用戶進程相關的內存段。
從9i開始使用PGA自動管理,參數指定一共使用的最大PGA內存的上限。參數用于開關PGA內存自動管理功能,auto/
在OLTP環境中,自動PGA管理只要設置到一定的值,如2G左右就能滿足系統的要求。
自動內存管理:
從9i開始,參數設置SGA的內存大小,不能動態修改
從10g開始,指定了參數后,所有的SGA組件如: pool、、large pool都不用手工指定了,會自動管理。這一特性就是自動共享內存管理ASMM。如果設置了=0,就自動關閉自動共享內存管理功能。大小不能超過的大小。
手動管理SGA:
=2000m;
=1000m;
_pool=200m;
=0---------關閉自動共享內存管理ASMM
11G以后sga+pga整個內存可以自動管理AMM,相關參數 .設置好這兩個參數后就不用關心SGA和PGA了
11g手動內存管理:
=3000m;
=2000m;
=1000m;
=0;---------關閉自動內存管理AMM
SGA+PGA最好不要超過總內存的70%