SGA:是用於存儲數據庫信息的內存區,該信息爲數據庫進程所共享。它包含Oracle 服務器的數據和控制信息,它是在Oracle服務器所駐留的計算機的實際內存中得以分配,若是實際內存不夠再往虛擬內存中寫。
PGA:是一塊包含一個服務進程的數據和控制信息的內存區域。它是Oracle在一個服務進程啓動時建立的,是非共享的。一個Oracle進程擁有一個PGA內存區。一個PGA也只能被擁有它的那個服務進程所訪問,只有這個進程中的Oracle代碼才能讀寫它。所以,PGA中的結構是不須要Latch保護的。java
咱們重點就是設置SGA,理論上SGA可佔OS系統物理內存的1/2——1/3
ORACLE給的建議是: OLTP系統 PGA=(Total Memory)*80%*20%。DSS系統PGA=(Total Memory)*80%*50%。
ORACLE建議一個數據庫服務器,分80%的內存給數據庫,20%的內存給操做系統,那怎麼給一個數據庫服務器配內存呢?
SQL> select * from v$pgastat;
NAME VALUE UNIT
---------------------------------------------------------------- ---------- ------------
aggregate PGA target parameter 104857600 bytes
-----這個值等於參數PGA_AGGREGATE_TARGET的值,若是此值爲0,表示禁用了PGA自動管理。
aggregate PGA auto target 75220992 bytes
-----表示PGA還能提供多少內存給自動運行模式,一般這個值接近pga_aggregate_target-total pga inuse.
global memory bound 20971520 bytes
-----工做區執行的最大值,若是這個值小於1M,立刻增長PGA大小
total PGA inuse 30167040 bytes
-----當前分配PGA的總大小,這個值有可能大於PGA,若是PGA設置過小.這個值接近select sum(pga_used_mem) from v$process.
total PGA allocated 52124672 bytes
-----工做區花費的總大小
maximum PGA allocated 67066880 bytes
total freeable PGA memory 0 bytes --沒有了空閒的PGA
process count 23 --當前有23個process
max processes count 25
PGA memory freed back to OS 0 bytes
total PGA used for auto workareas 8891392 bytes
maximum PGA used for auto workareas 22263808 bytes
total PGA used for manual workareas 0 bytes --爲0自動管理
maximum PGA used for manual workareas 0 bytes --爲0自動管理
over allocation count 0
若是PGA設置過小,致使PGA有時大於PGA_AGGREGATE_TARGET的值,此處爲0,說明PGA沒有擴展大於TARGET的值,若是此值出現過,那麼增長PGA大小。
bytes processed 124434432 bytes
extra bytes read/written 0 bytes
cache hit percentage 100 percent ---命中率爲100%,若是過小增長PGA
recompute count (total) 6651
19 rows selected
SQL> select max(pga_used_mem)/1024/1024 M from v$process; ----當前一個process消耗最大的內存
M
----------
9.12815189
SQL> select min(pga_used_mem)/1024/1024 M from v$process where pga_used_mem>0; ---process消耗最少內存
M
----------
0.19186878
SQL> select max(pga_used_mem)/1024/1024 M from v$process ; ----process曾經消耗的最大內存
M
----------
9.12815189
SQL> select sum(pga_used_mem)/1024/1024 from v$process; ----當前process一共消耗的PGA
SUM(PGA_USED_MEM)/1024/1024
---------------------------
28.8192501068115
如何設置PGA呢?咱們能夠在壓力測試階段,模擬一下系統的運行,而後運行
select (select sum(pga_used_mem)/1024/1024 from v$process) /(select count(*) from v$process) from dual;獲得一個process大約佔用了多少的內存,而後估算系統一共會有多少鏈接,好比一共有500個鏈接,
那麼Sessions=1.1*process +5=500,那麼processes=450,再乘以一個process須要消耗的內存,就能大約估算出PGA須要設置多大。
最好將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
若是1000m若是pga_aggregate_target>2.5G,那麼最大內存爲2.5G.
SQL> SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
2 FROM SYS.x$ksppi x, SYS.x$ksppcv y
3 WHERE x.inst_id = USERENV ('Instance')
4 AND y.inst_id = USERENV ('Instance')
5 AND x.indx = y.indx
6 AND x.ksppinm LIKE '%&par%'
7 /
NAME VALUE DESCRIB
-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
_smm_max_size 20480 maximum work area size in auto mode (serial)
SQL> show parameter pga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 100M
此處個人一個process可以分配的最大內存爲20M,由於個人PGA=100M,符合上面的規則。
隱含參數_smm_max_size表示一個process可以分配最大的memory.
sql
買了piner的《oracle高可用環境》一書,正好趁這段時間學習一下。
把看到的東西總結一下發表於此,今天先發第一章關於SGA與PGA的內容。
之後會陸續將總結在此發表,與你們共享。
SGA與PGA的結構以下圖:數據庫
SGA:
查看SGA:
Sqlp> show sga
或 select * from v$sga;
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 176161448 bytes
Database Buffers 109051904 bytes
Redo Buffers 2945024 bytes
Fixed Size:包括了數據庫與實例的控制信息、狀態信息、字典信息等,啓動時就被固定在SGA中,不會改變。
Variable Size:包括了shard pool、large pool、java pool、stream pool、遊標區和其餘結構
Database Buffers:數據庫中數據塊緩衝的地方,是SGA中最大的地方,決定數據庫性能
Redo Buffers:提供REDO緩衝的地方,在OLAP中不須要太大
V$sgastat記錄了SGA的一些統計信息
V$sga_dynamic_components保存SGA中能夠手動調整的區域的一些調整記錄
Shard pool:
Shard_pool_size決定其大小,10g之後自動管理
Shard_pool中數據字典和控制區結構用戶沒法直接控制,與用戶有關的只有sql緩衝區(library cache)。
將常常訪問的過程或包用DBMS_SHARED_POOL.KEEP存儲過程將該包pin在共享池中。
手工清除共享池的內容:alter system flush shard_pool;
共享池相關的幾個經常使用的視圖:
V$sqlarea 記錄了全部sql的統計信息,包括執行次數、物理讀、邏輯讀、耗費時間等
V$sqltext_with_newline 徹底顯示sql語句,經過hash_value來標示語句,piece排序
V$sql_plan保存了sql的執行計劃,經過工具查看
V$shared_pool_advice對共享池的預測,能夠作調整SGA的參考
Data buffer:
在OLTP系統中要求data buffer 的命中率在95%以上
select sum(pins) "execution",sum(pinhits) "hits",
((sum(pinhits)/sum(pins))*100) "pinhitration",
sum(reloads) "misses",((sum(pins)/(sum(pins)
+sum(reloads)))*100) "relhitratio"
from V$librarycache
PINS NUMBER Number of times a PIN was requested for objects of this namespace
PINHITS NUMBER Number of times all of the metadata pieces of the library object were found in memory
RELOADS NUMBER Any PIN of an object that is not the first PIN performed since the object handle was created, and which requires loading the object from disk服務器
Oracle把從data buffer中得到的數據庫叫cache hit,把從磁盤得到的腳cache miss
數據緩衝區中的數據塊經過髒列表(dirty list)和LRU列表(LRU list)來管理。
Data buffer可細分爲:default pool、keep pool、recycle pool對應的參數爲db_cache_size、 db_keep_cache_size 、db_recycle_size分別表示緩衝區大小
從9i開始oracle支持不一樣塊大小的表空間,相應的能夠爲不一樣塊大小的表空間指定不一樣塊大小的數據緩衝區,不一樣塊大小的數據緩衝區能夠用相應的db_nk_cache_size來指定,其中n能夠是二、四、六、16或32
V$db_cache_advice 對數據緩衝區的預測,能夠作調整data buffer的參考
V$bh、x$bh記錄了數據塊在data buffer中緩衝的狀況,經過這個視圖能夠找系統中的熱點塊。經過下面語句找系統中top 10 熱點快所在的熱點對象:
Select /*+ rule*/ owner,object_name from dba_objects
Where data_object_id in
(select obj from
(select obj from x$bh order by tch desc)
Where rownum<11);
PGA:
用來保存於用戶進程相關的內存段。
從9i開始使用PGA自動管理,pga_aggregate_target參數指定session一共使用的最大PGA內存的上限。Workarea_size_policy參數用於開關PGA內存自動管理功能,auto/manual
在OLTP環境中,自動PGA管理只要設置到必定的值,如2G左右就能知足系統的要求。
自動內存管理:
從9i開始,sga_max_size參數設置SGA的內存大小,不能動態修改
從10g開始,指定了sga_target參數後,全部的SGA組件如:shared pool、 data buffer、 large pool都不用手工指定了,Oracle會自動管理。這一特性就是自動共享內存管理ASMM。若是設置了sga_target=0,就自動關閉自動共享內存管理功能。Sga_target大小不能超過sga_max_size的大小。
手動管理SGA:
Alter system set sga_target=2000m;
Alter system set db_cache_size=1000m;
Alter system set shared_pool=200m;
Alter system set sga_target=0---------關閉自動共享內存管理ASMM
11G之後sga+pga整個內存能夠自動管理AMM,相關參數memory_max_target memory_target.設置好這兩個參數後就不用關心SGA和PGA了
11g手動內存管理:
Alter system set memory_target=3000m;
Alter system set sga_target=2000m;
Alter system set pga_aggregate_target=1000m;
Alter system set memory_target=0;---------關閉自動內存管理AMM
SGA+PGA最好不要超過總內存的70%session
補充:總原則:OS 使用內存+SGA+併發執行進程數*(sort_area_size+hash_ara_size+2M) < 0.7*總內存
簡單說就是:SGA+PGA+OS使用內存<總物理RAM併發
關於SGA、PGA與系統內存三者間的關聯,目前有一個相對通用的計算規則可供參考:
對於OLTP數據庫,SGA=系統內存*70%*80%,PGA=SGA*(10%~20%)。SGA=系統內存*0.56 PGA=系統內存*(0.05~0.1)
對於OLAP數據庫,SGA=系統內存*80%*60%,PGA=SGA*(45%~65%)。SGA=系統內存*0.48 PGA=系統內存*(0.22~0.31)
(對於32bit平臺,默認狀況下SGA最大可用內存有1.7GB的限制)oracle
實例配置時須要考慮的因素ide
一:物理內存多大工具
二:操做系統估計須要使用多少內存性能
三:數據庫是使用文件系統仍是裸設備
四:有多少併發鏈接
五:應用是OLTP 類型仍是OLAP 類型