3、大型池:
可以減輕共享池的負(fù)擔(dān)
可以為備份、恢復(fù)等操作來使用
不使用LRU算法來管理
其大小由數(shù)據(jù)庫的‘共享模式/db模式’如果是共享模式的話,要分配的大一些
指定Large Pool的大小,ALTER SYSTEM SET LARGE_POOL_SIZE=64M
3、Java池:
在安裝和使用Java的情況下使用
如何估算PGA,SGA的大小,配置數(shù)據(jù)庫服務(wù)器的內(nèi)存
ORACLE給的建議是: OLTP系統(tǒng) PGA=(Total Memory)*80%*20%。DSS系統(tǒng)PGA=(Total Memory)*80%*50%。
ORACLE建議一個(gè)數(shù)據(jù)庫服務(wù)器,分80%的內(nèi)存給數(shù)據(jù)庫,20%的內(nèi)存給操作系統(tǒng),那怎么給一個(gè)數(shù)據(jù)庫服務(wù)器配內(nèi)存呢?
SQL> select * from v$pgastat;
NAME VALUE UNIT
---------------------------------------------------------------- ---------- ------------
aggregate PGA target parameter 104857600 bytes
-----這個(gè)值等于參數(shù)PGA_AGGREGATE_TARGET的值,如果此值為0,表示禁用了PGA自動(dòng)管理。
aggregate PGA auto target 75220992 bytes
-----表示PGA還能提供多少內(nèi)存給自動(dòng)運(yùn)行模式,通常這個(gè)值接近pga_aggregate_target-total pga inuse.
global memory bound 20971520 bytes
-----工作區(qū)執(zhí)行的最大值,如果這個(gè)值小于1M,馬上增加PGA大小
total PGA inuse 30167040 bytes
-----當(dāng)前分配PGA的總大小,這個(gè)值有可能大于PGA,如果PGA設(shè)置太小.這個(gè)值接近select sum(pga_used_mem) from v$process.
total PGA allocated 52124672 bytes
-----工作區(qū)花費(fèi)的總大小
maximum PGA allocated 67066880 bytes
total freeable PGA memory 0 bytes ----沒有了空閑的PGA
process count 23 ----當(dāng)前一個(gè)有23個(gè)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自動(dòng)管理
maximum PGA used for manual workareas 0 bytes ---為0自動(dòng)管理
over allocation count 0
如果PGA設(shè)置太小,導(dǎo)致PGA有時(shí)大于PGA_AGGREGATE_TARGET的值,此處為0,說明PGA沒有擴(kuò)展大于TARGET的值,如 果此值出現(xiàn)過,那么增加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; ----當(dāng)前一個(gè)process消耗最大的內(nèi)存
M
----------
9.12815189
SQL> select min(pga_used_mem)/1024/1024 M from v$process where pga_used_mem>0; ---process消耗最少內(nèi)存
M
----------
0.19186878
SQL> select max(pga_used_mem)/1024/1024 M from v$process ; ----process曾經(jīng)消耗的最大內(nèi)存
M
----------
9.12815189
SQL> select sum(pga_used_mem)/1024/1024 from v$process; ----當(dāng)前process一共消耗的PGA
SUM(PGA_USED_MEM)/1024/1024
---------------------------
28.8192501068115
如何設(shè)置PGA呢?我們可以在壓力測試階段,模擬一下系統(tǒng)的運(yùn)行,然后運(yùn)行
select (select sum(pga_used_mem)/1024/1024 from v$process) /(select count(*) from v$process) from dual;得到一個(gè)process大約占用了多少的內(nèi)存,然后估算系統(tǒng)一共會(huì)有多少連接,比如一共有500個(gè)連接,
那么Sessions=1.1*process +5=500,那么processes=450,再乘以一個(gè)process需要消耗的內(nèi)存,就能大約估算出PGA需要設(shè)置多大。
最好將PGA設(shè)置的值比計(jì)算出的值大一點(diǎn),PGA值設(shè)定好后,就可以根據(jù)系統(tǒng)的性質(zhì),如果系統(tǒng)為OLTOP,那么總的內(nèi)存可以設(shè)置為 PGA/0.16,最后也能估算出SGA的大小,建議還是多配點(diǎn)內(nèi)存,反正便宜。
下面摘抄eygle的關(guān)于一個(gè)process能夠分配的最大內(nèi)存(串行操作)的規(guī)則:
10gR1之前,對于串行操作(非并行)一個(gè)process能夠分配的最大的內(nèi)存為 min(5%pga_aggregate_target,100m)
10gR2之后,對于串行操作(非并行)一個(gè)process能夠分配的最大內(nèi)存有如下規(guī)則:
如果pga_aggregate_target<=500m,那么最大的內(nèi)存為20%*pga_aggregate_target.
如果500m<pga_aggregate_target<=1000m,那么最大內(nèi)存為100m.
如果1000m<pga_aggregate_target<=2.5G,那么最大內(nèi)存為 10%*pga_aggregate_target.
如果pga_aggregate_target>2.5G,那么最大內(nèi)存為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
此處我的一個(gè)process能夠分配的最大內(nèi)存為20M,因?yàn)槲业腜GA=100M,符合上面的規(guī)則。
隱 含參數(shù)_smm_max_size表示一個(gè)process能夠分配最大的memory.
買了piner的《oracle高可用環(huán)境》一書,正好趁這段時(shí)間學(xué)習(xí)一下。
把看到的東西總結(jié)一下發(fā)表于此,今天先發(fā)第一章關(guān) 于SGA與PGA的內(nèi)容。
以后會(huì)陸續(xù)將總結(jié)在此發(fā)表,與大家共享。
SGA與PGA的結(jié)構(gòu)如下圖:
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:包括了數(shù)據(jù)庫與實(shí)例的控制信息、狀態(tài)信息、字典信息等,啟動(dòng)時(shí)就被固定在SGA中,不會(huì)改變。
Variable Size:包括了shard pool、large pool、java pool、stream pool、游標(biāo)區(qū)和其他結(jié)構(gòu)
Database Buffers:數(shù)據(jù)庫中數(shù)據(jù)塊緩沖的地方,是SGA中最大的地方,決定數(shù)據(jù)庫性能
Redo Buffers:提供REDO緩沖的地方,在OLAP中不需要太大
V$sgastat記錄了SGA的一些統(tǒng)計(jì)信息
V$sga_dynamic_components 保存SGA中可以手動(dòng)調(diào)整的區(qū)域的一些調(diào)整記錄
Shard pool:
Shard_pool_size決定其大小,10g以后 自動(dòng)管理
Shard_pool中數(shù)據(jù)字典和控制區(qū)結(jié)構(gòu)用戶無法直接控制,與用戶有關(guān)的只有sql緩沖區(qū)(library cache)。
將 經(jīng)常訪問的過程或包用DBMS_SHARED_POOL.KEEP存儲(chǔ)過程將該包pin在共享池中。
手工清除共享池的內(nèi)容:alter system flush shard_pool;
共享池相關(guān)的幾個(gè)常用的視圖:
V$sqlarea 記錄了所有sql的統(tǒng)計(jì)信息,包括執(zhí)行次數(shù)、物理讀、邏輯讀、耗費(fèi)時(shí)間等
V$sqltext_with_newline 完全顯示sql語句,通過hash_value來標(biāo)示語句,piece排序
V$sql_plan保存了sql的執(zhí)行計(jì)劃,通過工具查看
V$shared_pool_advice 對共享池的預(yù)測,可以做調(diào)整SGA的參考
Data buffer:
在OLTP系統(tǒng)中要求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中獲得的數(shù)據(jù)庫叫cache hit,把從磁盤獲得的腳cache miss
數(shù)據(jù)緩沖 區(qū)中的數(shù)據(jù)塊通過臟列表(dirty list)和LRU列表(LRU list)來管理。
Data buffer可細(xì)分為:default pool、keep pool、recycle pool對應(yīng)的參數(shù)為db_cache_size、 db_keep_cache_size 、db_recycle_size分別表示緩沖區(qū)大小
從9i開始o(jì)racle支持不同塊大小的 表空間,相應(yīng)的可以為不同塊大小的表空間指定不同塊大小的數(shù)據(jù)緩沖區(qū),不同塊大小的數(shù)據(jù)緩沖區(qū)可以用相應(yīng)的db_nk_cache_size來指定,其中 n可以是2、4、6、16或32
V$db_cache_advice 對數(shù)據(jù)緩沖區(qū)的預(yù)測,可以做調(diào)整data buffer的參考
V$bh、 x$bh記錄了數(shù)據(jù)塊在data buffer中緩沖的情況,通過這個(gè)視圖可以找系統(tǒng)中的熱點(diǎn)塊。通過下面語句找系統(tǒng)中top 10 熱點(diǎn)快所在的熱點(diǎn)對象:
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:
用來保存于用戶進(jìn)程相 關(guān)的內(nèi)存段。
從9i開始使用PGA自動(dòng)管理,pga_aggregate_target參數(shù)指定session一共使用的最大PGA內(nèi)存的上限。 Workarea_size_policy參數(shù)用于開關(guān)PGA內(nèi)存自動(dòng)管理功能,auto/manual
在OLTP環(huán)境中,自動(dòng)PGA 管理只要設(shè)置到一定的值,如2G左右就能滿足系統(tǒng)的要求。
自動(dòng)內(nèi)存管理:
從9i開始,sga_max_size參數(shù)設(shè)置SGA 的內(nèi)存大小,不能動(dòng)態(tài)修改
從10g開始,指定了sga_target參數(shù)后,所有的SGA組件如:shared pool、 data buffer、 large pool都不用手工指定了,Oracle會(huì)自動(dòng)管理。這一特性就是自動(dòng)共享內(nèi)存管理ASMM。如果設(shè)置了sga_target=0,就自動(dòng)關(guān)閉自動(dòng)共享內(nèi) 存管理功能。Sga_target大小不能超過sga_max_size的大小。
手動(dòng)管理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---------關(guān)閉自動(dòng)共享內(nèi)存管理ASMM
11G以后sga+pga整個(gè)內(nèi)存可以自動(dòng)管理AMM,相關(guān) 參數(shù)memory_max_target memory_target.設(shè)置好這兩個(gè)參數(shù)后就不用關(guān)心SGA和PGA了
11g手動(dòng)內(nèi)存管理:
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;---------關(guān)閉自動(dòng)內(nèi)存管理AMM
SGA+PGA最好不要超過總內(nèi)存的70%
聯(lián)系客服