Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1614113
  • 博文数量: 292
  • 博客积分: 10791
  • 博客等级: 上将
  • 技术积分: 2479
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-20 21:06
文章分类

全部博文(292)

文章存档

2011年(31)

2010年(261)

分类: Oracle

2010-07-27 18:33:50

在Oracle 9i之前,我们主要是通过设置sort_area_size、hash_area_size等参数值(通常都叫做*_area_size)
来管理PGA的使用,不过严格说来,是对PGA中的UGA进行管理。这些参数都是针对session而言的,有些session
需要的PGA多,有些需要的少,设置过大或过小都可能导致性能问题或浪费问题。

这里Oracle从9i开始引入自动PGA管理来进行PGA内存设置。首先,设置workarea_size_policy参数。该参数
为auto(也是默认值)时,表示启用PGA自动管理;而设置该参数为manual时,则表示禁用PGA自动管理,仍
然沿用Oracle 9i之前的方式,也就是使用*_area_size对PGA进行管理。

DBA可以根据数据库的负载情况估计所有session大概需要消耗的PGA的内存总和,然后把该值设置为初始化
参数pga_aggregate_target的值即可。Oracle会按照每个session的需要为其分配PGA,同时会尽量维持整个
PGA的内存总和不超过该参数所定义的值。

遗憾的是,Oracle 9i下的PGA自动管理只对专用连接方式有效,对共享连接方式无效。Oracle 10g以后对两
种连接方式都有效。

我们一旦设置了pga_aggregate_target以后,所有的*_area_size就将被忽略.

在PGA中,对性能影响最大的就是SQL工作区(work area)。一般的,SQL工作区越大则对于SQL语句的执行的
效率就高,从而对于用户的响应时间就越少; 不过很多情况下SQL工作区是不能容纳执行SQL所需要的内存
空间的,从而不得不交换到临时表空间里。为了衡量执行SQL所需要的内存与实际分配给该SQL的SQL工作区
之间的契合程度,Oracle将所分配的SQL工作区大小分成以下三种类型。

--optimal尺寸:SQL语句能够完全在所分配的SQL工作区内完成所有的操作。这时的性能最佳。
--onepass尺寸:SQL语句需要与磁盘上的临时表空间交互一次才能够在所分配的SQL工作区中完成所有的操作。
-- multipass尺寸:由于SQL工作区过小,从而导致SQL需要与磁盘上的临时表空间交互多次才能完成所有操作。
  这个时候的性能将急剧下降。

当系统整体负载不大时,Oracle倾向于为每个session的PGA分配optimal尺寸大小的SQL工作区;而随着负载
上升,比如连接的session逐渐增多导致同时执行的SQL语句越来越多时,Oracle就会倾向于为每个session
的PGA分配onepass尺寸大小的SQL工作区,甚至是multipass尺寸的SQL工作区了。


Oracle为了帮助我们确定这个参数的值,引入了一个新的视图v$pga_target_advice。为了使用该视图,需
要将初始化参数statistics_level设置为typical(默认值)或all。

select round(pga_target_for_estimate /(1024*1024)) "Target (M)",
     estd_pga_cache_hit_percentage "Est. Cache Hit %",
     round(estd_extra_bytes_rw/(1024*1024)) "Est. ReadWrite (M)",
     estd_overalloc_count "Est. Over-Alloc"
from v$pga_target_advice ;


阅读(1248) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~