ORACLE記憶體管理 之一 ORACLE PGA

weifenghq發表於2007-01-05
MEM主要由兩部分組成

SGA, System Global Area---可以被所以PROCESS訪問。

PGA, Process Global Area—單個PROCESSthread私有。

UGA會包括在其中之一里

UGA, User Global Area—SESSION私有,shared server的時候在SGAdedicated server的時候在PGA

  1. 首先先看看PGA

WORKAREA_SIZE_POLICY指的就是PGA的管理,PGA的管理分手工和自動(PGA裡非UGA的部分,比如sortinghashing,以下引數在手工管理時用到SORT_AREA_SIZE,SORT_AREA_RETAINED_SIZE,sort結束後保留的大小,比如 SORT_AREA_SIZE1M, SORT_AREA_RETAINED_SIZE512K,則一個大的SORT可能用完1M,SORT 完後超過512K的會交換到TEMP SEGMENT.

HASH_AREA_SIZE server process用來在記憶體裡存hash table的大小.

大致來看,如果workarea_size_policy=manual那麼pga_aggregate_target將會不被使用,而是使用響應的sort_area_size,hash_area_size引數.;如果workarea_size_policy=auto的話那麼就會使用pga_aggregate_target而不使用其他的sort_area_size,hash_area_size引數.

if ( 資料庫版本 >= 10gR1 )

then

if (workarea_size_policy=auto)

then

sort area size 無效

else

sort area size 有效

end if

else -- 資料庫版本 < 10gr1

if ( shared server 連線方式 )

then

sort area size 有效

else -- dedicated server連線方式

if (workarea_size_policy=auto)

then

sort area size 無效

else

sort area size有效

end if

end if

end if

  • sort_area_size 512K,1M,1G來看手工與自動管理時的異同,以下是自動管理

SQL> create table wwm as select * from all_objects;

SQL> alter session set sort_area_size=524288;

session xxx memory表示現在這個時刻用了多少,session xxx memory max 表示最高峰時用了多少

SQL> set autotrace traceonly statistics;

SQL> select * from wwm order by 1,2,3,4

---------------------------------------------------------

0 recursive calls

0 db block gets

420 consistent gets

0 physical reads

0 redo size

2178018 bytes sent via SQL*Net to client

22768 bytes received via SQL*Net from client

2038 SQL*Net roundtrips to/from client

1 sorts (memory)

0 sorts (disk)

30547 rows processed

SQL> alter session set sort_area_size=1048576; 同上

SQL> alter session set sort_area_size=1048576000; 同上

自動管理時sort_area_size不起作用.

  • 改成手工管理後

SQL> alter session set workarea_size_policy=manual;

SQL> alter session set sort_area_size = 65536; --64K

SQL> set autotrace traceonly statistics;

SQL> select * from wwm order by 1,2,3,4

----------------------------------------------------------

0 recursive calls

22 db block gets

420 consistent gets

513 physical reads

0 redo size

2178018 bytes sent via SQL*Net to client

22768 bytes received via SQL*Net from client

2038 SQL*Net roundtrips to/from client

0 sorts (memory)

1 sorts (disk)

30547 rows processed

============退出,重進

SQL> alter session set sort_area_size=1048576;

SQL> set autotrace traceonly statistics;

SQL> select * from wwm order by 1,2,3,4;

----------------------------------------------------------

0 recursive calls

4 db block gets

420 consistent gets

424 physical reads

0 redo size

2178018 bytes sent via SQL*Net to client

22768 bytes received via SQL*Net from client

2038 SQL*Net roundtrips to/from client

0 sorts (memory)

1 sorts (disk)

30547 rows processed

還有排序操作在DISK

SQL> set autotrace off

==============退出,重進

SQL> alter session set sort_area_size=1048576000;

SQL> set autotrace traceonly statistics;

SQL> select * from wwm order by 1,2,3,4;

----------------------------------------------------------

0 recursive calls

0 db block gets

420 consistent gets

0 physical reads

0 redo size

2178018 bytes sent via SQL*Net to client

22768 bytes received via SQL*Net from client

2038 SQL*Net roundtrips to/from client

1 sorts (memory)

0 sorts (disk)

30547 rows processed

以上分別用64K,1M,1G來測試,分配1G並不代表就要切實分配1GMEM出去。而是說你有權利用到1G,相反,設定64K並不代表你的session只能用64k,一個SQL可能有多個SORT,指的是每個SORT 的限額.

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/633084/viewspace-888417/,如需轉載,請註明出處,否則將追究法律責任。

相關文章