1、觀察沒實驗前的PGA使用情況
SQL> selectspid,PGA_USED_MEM,PGA_ALLOC_MEM,PGA_FREEABLE_MEM,PGA_MAX_MEM from v$process a,v$session b,v$mystat c wherea.addr=b.paddr and b.sid=c.sid and rownum=1;
SPID PGA_USED_MEM PGA_ALLOC_MEM PGA_FREEABLE_MEM PGA_MAX_MEM
---------- ------------ ------------- ---------------- -----------
5752 1432820 2818368 327680 6995616
PGA_USED_MEM:PGA可用空間
PGA_ALLOC_MEM:PGA配置設定的空間
PGA_FREEABLE_MEM:可釋放空間
PGA_MAX_MEM:PGA最大空間
2、建立新使用者和表空間
為了更加友善的做實驗,我們來創新新的表空間及新使用者并配置設定新的表空間為預設表空間:
create tablesapce name datafile ‘/../..dbf’size 500M;
create user name identified by pwd defaulttablespace name
grant dba to name
3、實驗的準備
在新使用者建立一個表
create table t1(id int,name varchar(20))
寫一個循環過程:
begin
for a in 1 … 1000000
loop
insert into t1 values(a,’abc’||a);
end loop;
commit;
end;
/
4、開始實驗觀察PGA
運作循環過程,會被鎖住運作直至結束,打開另一個會話視窗,不斷運作下面的sql語句觀察PGA運作情況:
SQL> selectPGA_USED_MEM,PGA_ALLOC_MEM,PGA_FREEABLE_MEM,PGA_MAX_MEM from v$process where spid=5752;
PGA_USED_MEM PGA_ALLOC_MEM PGA_FREEABLE_MEM PGA_MAX_MEM
------------ -------------- --------------- -----------
5817552 6995616 589824 6995616
我們可以觀察到:
1、 PGA_USED_MEM不斷的增大
2、 PGA_ALLOC_MEM與PGA_MAX_MEM相等
3、 PGA_FREEABLE_MEM可釋放的PGA增大
4、 直到循環運作結束,PGA不再變動,也就是說不會下降
結論:
每當出現一個會話時都會産生PGA記憶體的占用,當執行sql語句的時候,PGA記憶體的使用情況會增大,當SQL語句執行完畢時隻要會話不關閉PGA的記憶體占用就不會被釋放,如果說有成千上萬個使用者每個人都占用着一個會話而不斷開,那麼PGA記憶體就一直被配置設定且占用着,而這僅僅隻是工作區的記憶體占用,非工作區(存放會話資訊)的記憶體占用是隐形的,如果這樣下去将會造成性能的問題,這就要求DBA根據不同的需要來調整PGA的大小以及會話空閑等待時間!