欢迎投稿

今日深度:

Oracle内存管理(之二),oracle内存管理

Oracle内存管理(之二),oracle内存管理


【深入解析--eygle】 学习笔记


1.2.2 UGACGA

 

UGA(用户全局区)由用户会话数据、游标状态和索引区组成。在共享服务器模式下,一个共享服务进程被多个用户进程共享,此时UGAShared PoolLarge Pool的一部分,而在专用服务器模式下,UGA则是PGA的一部分。

 

不考虑Shared  Server模式,在Dedicated模式下,PGAUGA关系,就如同ProcessSession的关系PGA是服务于进程的内存结构,包含进程信息;而UGA是服务于会话的,它包含的是会话的信息UGA中包含如下信息:

1)打开游标的永久区和运行区;

2)包的状态信息以及变量信息;

3Java会话的状态信息;

4)启用角色信息、跟踪事件;

5)起作用的NLS参数;

6)所有打开的database links

7)会话访问控制信息等

 

UGA也由两组区组成,固定UGA和可变UGA(或者说UGA堆)。固定UGA包含了大概70个原子变量、小的数据结构以及指向UGA堆的指针。

 

UGA中的内存分配可以通过内部表X$KSMUPX$KSMUP - [K]ernel [S]ervice[M]emory [U]GA Hea[P])查询得到UGA堆包含了存储一些固定表(X$表)的永久内存(依赖于特定参数的设置,如OPEN_CURSORSOPEN_LINKSMAX_ENABLED_ROLES)。

 

sys@felix SQL>select ADDR,KSMCHCOM,KSMCHPTR,KSMCHSIZ,KSMCHCLS,KSMCHTYP,KSMCHPAR from x$ksmup;

 

ADDR             KSMCHCOM                         KSMCHPTR           KSMCHSIZ KSMCHCLS           KSMCHTYP KSMCHPAR

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

00007F528F1D6920dbgdInitEventGr                 00007F528F23FFB0         80freeabl                   0 00

00007F528F1D68C8 sessionlanguag                 00007F528F23FD60        592freeabl                   0 00

00007F528F1D6870 SessionNCHAR l                 00007F528F23FB10        592freeabl                   0 00

00007F528F1D6818 kdlw:UGAstate                  00007F528F23FAC8         72freeabl                   0 00

00007F528F1D67C0 kdlu:UGAstate                   00007F528F23FAA0         40 freeabl                   0 00

00007F528F1D6768kzsrcrdi                        00007F528F23F960        320freeabl                   0 00

00007F528F1D6710kzctxhugi1                      00007F528F23E948       4120 freeabl                   0 00

00007F528F1D66B8 PLS ccahp desc                 00007F528F23E7D0        376freeabl                   0 00

00007F528F1D6660 PLS ccahp desc                 00007F528F23E658        376freeabl                   0 00

00007F528F1D6608 PLS UGAhp                      00007F528F23DE50       2056recr                   409500007F528F23E7E8

00007F528F1D65B0 kgsc htsegs                    00007F528F23DE30         32freeabl                   0 00

00007F528F1D6558 kgsc htsegs                    00007F528F23DE10         32freeabl                   0 00

00007F528F1D6500 kgsc htsegs                    00007F528F23DDF0         32freeabl                   0 00

00007F528F1D64A8 kgsc htsegs                     00007F528F23DDD0         32 freeabl                   0 00

00007F528F1D6450 kgsc htsegs                    00007F528F23DDB0         32freeabl                   0 00

00007F528F1D63F8 kgsc htsegs                    00007F528F23DD90         32freeabl                   0 00

00007F528F1D63A0 kgsc htsegs                    00007F528F23DD70         32freeabl                   0 00

00007F528F1D6348 kgsc htsegs                    00007F528F23DD50         32freeabl                   0 00

00007F528F1D62F0 kgsc htsegs                    00007F528F23DD30         32freeabl                   0 00

00007F528F1D6298 kgsc htsegs                    00007F528F23DD10         32freeabl                   0 00

00007F528F1D6240 kgsc htsegs                     00007F528F23DCF0         32 freeabl                   0 00

00007F528F1D61E8 kgsc htsegs                    00007F528F23DCD0         32freeabl                   0 00

00007F528F1D6190 kgsc htsegs                    00007F528F23DCB0         32freeabl                   0 00

00007F528F1D6138 kgsc htsegs                    00007F528F23DC90         32freeabl                   0 00

00007F528F1D60E0 kgsc htsegs                    00007F528F23DC70         32freeabl                   0 00

 

 

Oracle9iR2开始,有一系列新的隐含参数被引入用于控制自动的PGA管理,这其中有一个关键的参数是_use_realfree_heap,当设置这个参数为true时,Oracle会为CGAUGA单独分配堆,而不从PGA中分配。它的默认值为false,而当设置了pga_aggregate_target后,它的值自动被改为true

 

SQL>SELECT x.ksppinm NAME, y.ksppstvl VALUE,x.ksppdesc describ

 FROMSYS.x$ksppi x, SYS.x$ksppcv y

 WHEREx.indx = y.indx AND x.ksppinm LIKE '%&par%';

Enter value for par: realfree

 

old   3:WHERE x.indx = y.indx AND x.ksppinm LIKE '%&par%'

new   3:WHERE x.indx = y.indx AND x.ksppinm LIKE '%realfree%'

 

NAME                                     VALUE         DESCRIB

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

_realfree_heap_max_size                  32768         minimum max total heap size, in Kbytes

_realfree_heap_pagesize_hint             65536         hint for real-free page size in bytes

_realfree_heap_mode                      0             mode flags for real-free heap

_use_realfree_heap                       TRUE          use real-free based allocator for PGAmemory

 

 SQL>

 

_use_realfree_heap 是自动管理PGA技术的关键技术变化,realfree代表着实时释放Oracle9i之前手工管理的PGA的主要问题在于,UGA缺省的在PGA中分配,当会话执行了诸如排序、HASH-JOIN等操作,耗用了大量PGA内存,而当会话执行完毕之后,内存会释放给PGA而不是OS,在很多时候这会导致过度的PGA内存使用(在以前版本PGA内存分配和回收是通过malloc()以及brk()调用来完成的);从Oracle9iR2开始,自动的PGA内存管理当_use_realfree_heaptrue时,PGA的内存分配将会通过mmap()调用来实现,这样当调用结束时将不必将内存返回给进程而直接返回给OS,从而实现了更好的PGA内存分配与使用。

 

通过V$PGASTAT视图可以查询PGA累计释放回OS的内存空间:

SQL> select name,value from v$pgastat wherename like '%OS';

 

NAME                                          VALUE

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

PGA memory freed back to OS                175374336

 

下图是UGA的结构示意图:




PGA的示意图中,还涉及了另外一块内存区域被称为CGACall Global  Area-调用全局区。与其他的全局区不同,CGA的存在是瞬间的,只存在于调用过程中,而且无论UGA存在于PGA还是SGACGA都是PGASubHeap。对 于 实 例 的 一 些 低 层 次 的 调 用Low-Level Call )需要CGA,包括分析SQL语句、执行SQL语句以及获取查询结果都需要使用CGA,在SQL执行过程中的每个递归调用需要一个独立的CGA,在SQL的解析过程中,查询数据字典信息、对SQL进行语法以及语义的解析、SQL的优化以及不同执行计划的评估都需要使用CGA

 

当然,调用并不是只通过CGA中的数据结构来工作,实际上调用所需要的大部分的重要数据结构都来自于UGA(如SQL AREA, PL/SQL AREASort Area都存放在UGA中,因为这些结构在调用期间需要一直可用),CGA中只包含了那些调用结束后可以被释放的数据。例如,CGA中包含了Direct I/O BUFFER、递归调用信息、表达式评估的堆栈信息等,此外Java调用内存也在CGA中分配。




操作系统与oracle的内存管理有何不同

oracle 内存管理 分 PGA 和SGA , PGA 管理 服务进程和后台 进程 SGA 管理 各种pool

操作系统的内存管理也有不一样的 DOS 单任务的 和 Windows 多线程的 Linux 多用户这种 管理的算法都不一样 都要找到一种最好的 内存 优化的办法适合系统的 ..
 

oracle 排序内存

排序内存涉及到PGA。
什么时候使用自动PGA内存管理?什么时候使用手动PGA内存管理?

白天系统正常运行时适合使用自动PGA内存管理,让Oracle根据当前负载自动管理、分配PGA内存。

夜里用户数少、进行维护的时候可以设定当前会话使用手动PGA内存管理,让当前的维护操作获得尽可能多的内存,加快执行速度。

如:服务器平时运行在自动PGA内存管理模式下,夜里有个任务要大表进行排序连接后更新,就可以在该操作session中临时更改为手动PGA内存管理,然后分配大的SORT_AREA_SIZE和HASH_AREA_SIZE(50%甚至80%内存,要确保无其他用户使用),这样能大大加快系统运行速度,又不影响白天高峰期对系统造成的影响。

操作命令

会话级更改

ALTER SESSION SET WORKAREA_SIZE_POLICY = {AUTO | MANAUL};

ALTER SESSION SET SORT_AREA_SIZE = 65536;

ALTER SESSION SET HASH_AREA_SIZE = 65536;

学以致用

1,排序区:

pga_aggregate_target为100MB,单个查询能用到5%也就是5MB时排序所需时间

SQL> create table sorttable as select * from all_objects;

表已创建。

SQL> insert into sorttable (select * from sorttable);

已创建49735行。

SQL> insert into sorttable (select * from sorttable);

已创建99470行。

SQL> set timing on;

SQL> set autotrace traceonly;

SQL> select * from sorttable order by object_id;

已选择198940行。

已用时间: 00: 00: 50.49

Session级修改排序区为30mb所需时间

SQL> ALTER SESSION SET WORKAREA_SIZE_POLICY = MANUAL;

会话已更改。

已用时间: 00: 00: 00.02

SQL> ALTER SESSION SET SORT_AREA_SIZE = 30000000;

会话已更改。

已用时间: 00: 00: 00.01

SQL> select * from sorttable order by object_id;

已选择198940行。

已用时间: 00: 00: 10.76

可以看到所需时间从50.49秒减少到10.31秒,速度提升很明显。

2,散列区:

pga_aggregate_target为100MB,单个查询能用到5%也就是5MB时表连接所需时间

SQL> select /*+ use_hash(tb1 tb2)*/ * from sorttable tb1,sorttable tb2 where tb1.object_id=tb2.object_id;

已选择49735行。

已用时间: 00: 00: 40.5......余下全文>>
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/2373.html NewsArticle Oracle内存管理(之二),oracle内存管理 【深入解析--eygle】 学习笔记 1.2.2 UGA 和 CGA UGA (用户全局区)由用户会话数据、游标状态和索引区组成。 在共享服务器模式下,一个共享服务进...
评论暂时关闭