当前位置:数据库 > Oracle >>

oracle之内存—鞭辟近里(三)

oracle之内存—鞭辟近里(三)
 
  一)pga introduction:
pga是为服务器进程分配的一块私有的内存,其中包含了相关数据信息和控制信息。每个进程只能对自己的pga区域进行读和写相应的执行代码信息。在运行区域中一个简单的内容就是游标,每个时间游标都会被执行,每个新的run-time area也是为游标相应的分配pga中的内存,以此来完成服务进程所要完成的执行操作。也就是说,run-time area 的创建和释放相应的内存是根据cursor的开启和关闭的。当在共享服务器模式下,一部分运行区域在sga中进行分配,如果large pool设置了那么就在large pool中分配,如果没有那么就存在于share pool中。
对于复杂的查询(如决策执行查询),那么大部分的运行区是从事于工作区进行密集型操作的,像如下:
》基于排序分类,像order by ,group by ,rollup以及窗口函数等
》hash-join
》bitmap merge
》bitmap create
》使用批量的写入buffer
sort area使用工作区的部分内存进行数据行的排序操作,同样的,这个hash-join操作使用hash area工作区进行处理一个散列表。
这个工作区域的大小能够被控制和进行相应的改变,通常,对一个消耗很多内存的特别的操作,一个大的工作区域能够显著提高这个处理性能。理想上,这个工作区域有一个合理的值,可以很好的处理sql语句所执行的数据操作。当工作区的值小于这个合理的值的时候,哪进行sql操作的时候势必会增减相应的执行时间,因为需要额外的把数据暂时缓存到磁盘上,然后在进行缓慢的处理。例如我要进行一个1g的数据排序操作,那么就需要有1g的内存需求,才能一次处理迅速处理完成,但是我的sort area为10M,那么它就会经过多次的数据input进行处理。
自动pga内存管理能够简化和改善pga内存的分配难题,默认情况下自动pga内存管理启动了,在这种情况下,oracle会自己动态的根据sga的20%调整一部分pga内存给work area,最小值为10M。
二)配置自动pga内存管理:
workarea_size_policy有两个值一个是auto代表开启pga自动管理,一个是manual代表进行手动管理pga。但是我在联机手册上看到这么一句话:
 
Note:
 
For backward compatibility, automatic PGA memory management can be disabled by setting the value of the PGA_AGGREGATE_TARGET initialization parameter to 0. When automatic PGA memory management is disabled, the maximum size of a work area can be sized with the associated _AREA_SIZE parameter, such as the SORT_AREA_SIZE initialization parameter.
当在自动pga管理方式下,设置一个pga_aggregate_target不为0的参数,然后oracle会根据这个参数的限制进行pga 内部的component的size turn,在这种情况下*_area_size参数就会被忽略失效(包括:
bitmap_merge_area_size        
create_bitmap_area_size       
hash_area_size                
sort_area_size                
workarea_size_policy
)。 
当配置一个刚刚创建的实例的时候,很难确定pga_aggregate_target该参数在参数文件中应该设置多么大的一个值,可以采用如下方法:
对于pga_aggregate_target参数值大小确认oracle给出了以下步骤:
 
 
1)在初始状态下并不知道oracle该值应该设置为多大合理,那么可以首先设置一个sga的20%,对于该值可能太小也可能大。后续在处理。
 
 
2)运行一些具有工作负荷的语句然后观察性能变化,然后使用pga统计这些数据,查看最大的使用pga是否在设置的值之下或是之上,然后进行相应的调整。
 
 
3)        参考使用oracle pga 诊断统计器的值,进行修改pga_aggregate_target参数大小。
必须根据具体的实际oracle说占有的内存,进行调整pga和sga的大小:
对于OLTP系统的话,划分一个很小的总占用内存的值,如20%,然后剩余80%给sga
对于dss系统,需要划分一个大点的值,以满足复杂请求需要,可以划分0%(仅此参考,具体情况还需诊断在确认)。
oracle这么也给出了一个很好的参考计算方法:
For OLTP: PGA_AGGREGATE_TARGET = (total_mem * 80%) * 20%
For DSS: PGA_AGGREGATE_TARGET = (total_mem * 80%) * 50%
三)监控自动pga管理的相关视图:
这些视图能够动态的查看pga内存管理的一些详细信息,便于研究性能瓶颈和调整pga_aggregate_target参数:
1、v$pgastat:该视图是在数据库的实例层,统计的自动内存分配情况:
eg:
 
SYS@orcl#select * from v$pgastat
  2  ;
NAME                                                              VALUE UNIT
------------------------------------------------------------ ---------- ------------------------
aggregate PGA target parameter                                268435456 bytes
aggregate PGA auto target                                     167362560 bytes
global memory bound                                            53686272 bytes
total PGA inuse                                                82583552 bytes
total PGA allocated                                           161752064 bytes
maximum PGA allocated                                         238797824 bytes
total freeable PGA memory                                       7536640 bytes
process count                                                        36
max processes count                                                  44
PGA memory freed back to OS                                  2492006400 bytes
total PGA used for auto workareas                                     0 bytes
NAME                                                              VALUE UNIT
------------------------------------------------------------ ---------- ------------------------
maximum PGA used for auto workareas                             5968896 bytes
total PGA used for manual workareas                                   0 bytes
maximum PGA used for manual workareas                            268288 bytes
over allocation count                                                 0
bytes processed                                           &nbs
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,