Oracle9i的动态SGA特性探索

oracle|动态

 Oracle9i数据库在内部特性方面有着非常大的增强,其中一个最令Oracle DBA兴奋的莫过于可以动态设置全部的Oracle SGA控制参数。与8i不同的是,原来都将初始化参数放到一个文本文件中,并且在数据库启动的时候读取,Oracle9i却可以通过ALTER DATABASE和ALTER SYSTEM命令复位全部的Oracle参数。

  在9i前,如果想对Oracle数据库的处理模式作一些改变的话,Oracle管理员必须关闭数据库并且重新设置INIT.ORA文件中的参数,然后重新启动数据库。对于白天使用OLTP模式运作,晚上切换到数据仓库模式的Oracle数据库来说,这种重新设置是经常做的。

  对于需要停止和重新启动Oracle数据库来修改参数来说,Oracle9i在这方面有明显的加强,它令实现数据库连续可用的目标变得更加简单。

  这种可以在Oracle SGA中动态增加和缩小不同区域的能力为Oracle数据库管理员提供了一些令人激动的新特性。SGA每个区域的数据库活动都可以独立地被监视,而且也可以在Oracle数据库中,根据使用的模式分配和取回资源。

  我们首先来看以下Oracle9i数据库和Oracle8i数据库的一些区别。Oracle9i的一个最重要的加强是对于连接到Oracle数据库的全部专用连接,都无需要拥有一个独立的PGA空间。在Oracle8i中,对于专用的Oracle连接,我们都需要在内存中分配一个独立的区域,称为Program Global Area或者PGA。PGA空间中包含有SORT_AREA_SIZE和额外的RAM控制结构以用来维护连接任务的状态。在Oracle9i中,PGA空间已经被Oracle SGA中的一个新内存空间代替,它是通过PGA_AGGREGATE_TARGET参数来设置的(见图1)。

          *********图一************
       (Oracle8i与Oracle9i在内存分配上的区别)

  由于全部的内存使用都在Oracle SGA中分配,所以Oracle数据库管理员可以将分配给Oracle服务器的内存加大,可以分配至直到Orace服务器全部内存的80%。Oracle建议将服务器其余的20%内存保留给操作系统的任务。

  当用户连接到Oracle9i数据库时,排序工作所需要的内存将会在Oracle9i的PGA_AGGREGATE_TARGET区域中分配。这可以令Oracle9i比Oracle8i跑得更快,这是由于内存只在需要的期间才分配,并且在完成后就可以马上释放给其它连接的Oracle任务使用。

  动态修改SGA区域

  由于Oracle管理员现在可以增加和减少SGA的全部区域,因此我们可以快速地查看一下SGA区域是怎样的,这样我们就可以知道Oracle DBA如何监视这些区域的使用并且为Oracle数据库更有效地重新分配内存。SGA的区域可以分为以下的部分。

  数据缓冲(Data buffers)--Oracle9i拥有多达7个独立的数据缓冲来保存磁盘送来的数据块。这些包含有传统的KEEP pool,RECYCLE pool和DEFAULT pool,还有为每个Oracle数据库支持的块大小(2K, 4K, 8K, 16K和32K) 而建立的独立数据缓冲池(见图2)。

         图2 独立的Oracle9i数据缓冲

  我们可以监视这7个数据缓冲区域的命中率,如果缓冲的命中率保持在百分之九十以上,我们可以减少分配给这些数据缓冲的内存,并且将它们重新分配给其它Oracle实例中需要额外内存的地方。

  当数据缓冲的命中率(DBHR)下降时,我们可以将内存由一个数据缓冲中分离出来,并且将它重新分配给其它的数据缓冲(如图3所示)。

      图3 在Oracle9i的数据缓冲之间重新分配内存

  共享池(Shared pool)--Oracle9i的共享池有一个很重要的作用是分析和执行Oracle SQL语句。低的library cache命中率表示分配给library cache的内存不足,当shared pool需要对SQL语句进行大量的分析和执行时,Oracle9i的数据库管理员可以使用ALTER SYSTEM来为shared pool加入额外的内存。

  PGA区域--分配给PGA_AGGREGATE_TARGET的内存是用来让Oracle连接维护与连接相关的信息(例如游标的状态),并且对SQL的结果集进行排序。

  Log buffer--对于Oracle redo log缓冲是否有大量活动,我们可以在log switch(日志转换)的频率上看出来。Oracle管理员可以监视redo log区域的活动,并且在Oracle数据库需要额外的内存为原始的缓冲区域服务时,动态地增加内存。

  现在就让我们来仔细看以下这些内存区域之间是如何作用的。

  改变PGA的内存分配

  当以下的其中一个条件是真时,我们将需要动态地修改PGA_AGGREGATE_TARGET参数。

  。当V$SYSSTAT中对"estimated PGA memory for one-pass" 的统计值超出PGA_AGGREGATE_TARGET时,我们就需要增加PGA_AGGREGATE_TARGET的值。

  。当V$SYSSTAT中对"workarea executions - multipass" 的统计值超过百分之一时,数据库将会由更多的内存中得到好处

  。你可能过高地估计了PGA内存的空间,当V$SYSSTAT中"workarea executions - optimal"的值一直是100%时,可以考虑减少PGA_AGGREGATE_TARGET的值。

  我们可以通过一个简单的脚本来查看shared pool是否需要更多的内存。

  量度Library Cache的丢失率

set lines 80;
set pages 999;

column mydate heading 'Yr. Mo Dy Hr.' format a16
column c1 heading "execs" format 9,999,999
column c2 heading "Cache Misses|While Executing" format 9,999,999
column c3 heading "Library Cache|Miss Ratio" format 999.99999

break on mydate skip 2;

select
to_char(snap_time,'yyyy-mm-dd HH24') mydate,
sum(new.pins-old.pins) c1,
sum(new.reloads-old.reloads) c2,
sum(new.reloads-old.reloads)/
sum(new.pins-old.pins) library_cache_miss_ratio
from
stats$librarycache old,
stats$librarycache new,
stats$snapshot sn
where
new.snap_id = sn.snap_id
and
old.snap_id = new.snap_id-1
and
old.namespace = new.namespace
group by
to_char(snap_time,'yyyy-mm-dd HH24')
;
Cache Misses
Yr. Mo Dy Hr. execs While Executing LIBRARY_CACHE_MISS_RATIO
---------------- ---------- --------------- ------------------------
2001-12-11 10 10,338 3 .00029
2001-12-12 10 182,477 134 .00073
2001-12-14 10 190,707 202 .00106
2001-12-16 10 2,803 11 .00392
  由上面的例子看到,在每天的9:00AM到10:AM之间,shared pool明显缺少内存。我们就可以在这段期间动态地重新设置shared_pool参数以由db_cache_size中分配额外的内存。

  SGA的阀值摘要

  由下面的表一可以看到,在监视SGA的内存使用时,有几个明显的阀值可以利用。我们可以写一些脚本并在其中集成一些智能,这样就可以在处理的需求变化时重新设置SGA。

RAM Area Too-small Condition Too-Large Condition
Shared pool Library cache misses No misses
Data buffer cache Hit ratio < 90% Hit ratio > 95%
PGA aggregate high multi-pass executions 100% optimal executions
  表1:SGA中的异常条件指示

  查看SGA内存区域的负载

  Oracle9i使用了一些新的内部视图或者在现有的视图中加入新的列来帮助查看Oracle9i中的内部内存分配情况。以下的新V$视图可以帮助监视Oracle9i连接的内存使用。

  V$PROCESS -在Oracle9i中加入了三个新的列以监视PGA内存的使用,新列的名字是pga_used_mem, pga_alloc_mem 和pga_max_mem。

  V$SYSSTAT -加入了很多新的统计行,包括有area statistics for optimal, one-pass和multi-pass。

  V$PGASTAT -该新视图展示了全部后台进程和专用连接的PGA内存使用

  V$SQL_PLAN--这个新视图包含了全部当前执行的SQL的执行计划信息。对于需要最优化的SQL语句的性能调整专家来说这是非常吸引人的。

  V$WORKAREA -这个新视图提供了Oracle9i连接的累积内存统计的详细信息。

  V$WORKAREA_ACTIVE - 这个新的视图提供了当前全部正在执行的SQL语句的内部内存使用信息。

  它们的目的是通过这些V$视图来监视SGA中的内存使用,然后根据Oracle实例的处理要求,通过ALTER SYSTEM命令重新分配内存。我们以下来看一些这些新的Oracle9i特性和脚本,它可以帮助我们查看详细的内存使用。

  当然我们不可能在这里详述所有的技术,以下就让我们看一个简单的例子,它通过使用V$SYSSTAT视图来决定何时重新设置PGA_AGGREGATE_TARGET参数。

  以下的查询可以得到自数据库实例启动后work areas被执行的全部数目和百分比。

work_area.sql

select
name profile,
cnt,
decode(total, 0, 0, round(cnt*100/total)) percentage
from
(
select
name,
value cnt,
(sum(value) over ()) total
from
v$sysstat
where
name like 'workarea exec%'
);
  这个查询的输出可能如下:

PROFILE CNT PERCENTAGE
----------------------------------- ---------- ----------
workarea executions - optimal 5395 95
workarea executions - onepass 284 5
workarea executions - multipass 0 0
  这个查询的输出是用来告诉DBA何时动态调整PGA_AGGREGATE_TARGET参数。在通常的情况下,如果multi-pass的执行大于0,就需要增加PGA_AGGREGATE_TARGET的值,并且在optimal executions是100%时减少它的值。

  我们还可以使用V$PGASTAT视图来决定我们的Oracle实例的内存使用。V$PGASTAT视图提供了PGA使用和自动内存管理的实例级摘要统计信息。以下的脚本提供了全部Oracle9i连接的整体内存使用的统计信息。

  以下是一个用来检测Oracle9i中PGA内存使用的简单脚本。

check_pga.sql

column name format a30
column value format 999,999,999

select
name,
value
from
v$pgastat
;
The output of this query might look like the following:

NAME VALUE
------------------------------------------------------ ----------
aggregate PGA auto target 736,052,224
global memory bound 21,200
total expected memory 141,144
total PGA inuse 22,234,736
total PGA allocated 55,327,872
maximum PGA allocated 23,970,624
total PGA used for auto workareas 262,144
maximum PGA used for auto workareas 7,333,032
total PGA used for manual workareas 0
maximum PGA used for manual workareas 0
estimated PGA memory for optimal 141,395
maximum PGA memory for optimal 500,123,520
estimated PGA memory for one-pass 534,144
maximum PGA memory for one-pass
  在上面的v$pgastat显示中我们可以看到以下的统计。

  Aggregate PGA auto target -该列给出了可用于Oracle9i连接的全部内存。我们已经提过,这个值是由PGA_AGGREGATE_TARGET设置的。

  Global memory bound -该统计表示work area的最大值,Oracle建议在该统计值下降到1M时,你应该增加PGA_AGGREGATE_TARGET的值。

  Total PGA allocated - 这个统计显示了数据库中全部PGA内存使用的高水位线。当使用增加时,你应该看到这个值接近PGA_AGGREGATE_TARGET的值。

  Total PGA used for auto workareas - 这个统计监视内存的使用或者全部运行在自动内存模式中的全部连接。要记住的是,并不是全部的内部进程使用自动内存特性。例如,Java和PL/SQL 将分配内存,但是这部分将不会统计到这个值中。因此我们可使用整体PGA的值来减去该值,以得到连接和Java and PL/SQL使用的内存。

  Estimated PGA memory for optimal/one-pass - 该统计估计optimal模式下执行全部的连接任务所需要的内存。要记住的是,如果Oracle9i遇到内存不足时,它就会调用multi-pass操作。这个统计对于监视Oracle9i中的内存使用是非常重要的,大多数的Oracle DBA将会增加PGA_AGGREGATE_TARGET到这个值。

  现在我们已经了解了这个概念,以下就让我们来看一下自动重新配置SGA有哪些方法。

  总述

  在一个UNIX环境中,在处理需求改变时通过定时任务来修改内存配置是非常简单的。例如,许多Oracle数据库在一般的工作时间以OLTP模式运作,在晚上的时候则运行对内存需求很大的批量报告。

  我们知道在一个OLTP数据库中应该将DB_CACHE_SIZE设置为一个较大的值,而在需求内存很大的批量任务中则需要给PGA_AGGREGATE_TARGET分配额外的内存。

  以下的UNIX脚本可以用来重新设置OLTP和DSS的SGA值而无需将实例停下来。在这个例子中,我们假定有一个孤立的带有8GB内存的的Oracle服务器。我们还假定保留20%的内存供UNIX使用,而剩下的6GB内存则用作Oracle和Oracle连接。这些脚本是在HP/UX或者Solaris中使用的,并且接受$ORACLE_SID作为一个参数。

  DSS_CONFIG.KSH脚本将在每晚的6:00 p.m运行,以重新设置Oracle在晚上运行对内存需求很大的批量任务。

dss_config.ksh

#!/bin/ksh

# First, we must set the environment . . . .
ORACLE_SID=$1
export ORACLE_SID
ORACLE_HOME=`cat /etc/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'`
#ORACLE_HOME=`cat /var/opt/oracle/oratab|grep ^$ORACLE_SID:|cut -f2 -d':'`
export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH
export PATH

$ORACLE_HOME/bin/sqlplus -s /nologin<connect system/manager as sysdba;
ALTER SYSTEM set db_cache_size=1500m;
ALTER SYSTEM set shared_pool_size=500m;
ALTER SYSTEM set pga_aggregate_target=400m;
exit
!

  现在我们已经知道了一个常见的方式来修改Oracle的配置,我们也很容易地看到可以很简单地开发一个技术来连续地监控Oracle的处理需求,并且根据现有的数据库需求来使用ALTER SYSTEM作修改。

  结论

  虽然Oracle9i中的内存管理仍然需要很多的手工操作,不过大部分的Oracle管理员可以使用工具来连续地监控Oracle SGA中的内存使用,并且可以根据Oracle instance中现在的使用情况来自动地重新分配内存。这样就可以令Oracle 管理员根据系统的变化来灵活地重新设置他们的系统。

时间: 2023-09-26

Oracle9i的动态SGA特性探索的相关文章

Oracle9i 动态SGA,PGA特性探索_oracle

"In the latest release 10.2 Oracle changed these default values. The memory allocated to a single SQL operator (_smm_max_size) is limited to: for P_A_T <= 500MB the parameter _smm_max_size = 20% of P_A_T for P_A_T between 500MB and 1000MB the para

理解Javascript的动态语言特性

  这篇文章主要介绍了理解Javascript的动态语言特性,需要的朋友可以参考下 Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行:javascript提供eval()函数,用于动态解释一段文本,并在当前上下文环境中执行. 首先我们需要理解的是eval()方法它有全局闭包和当前函数的闭包,比如如下代码,大家认为会输出什么呢? ? 1 2 3 4 5 6 7 var i = 100; function myFunc() { var

C# 动态语言特性,dynamic 关键字研究

原文:C# 动态语言特性,dynamic 关键字研究 1       动态语言简介 支持动态特性的语言现在大行其道,并且有继续增长的趋势.比如 Ruby 和 Python, 还有天王级的巨星 --- JavaScript. 现在一个程序员说自己对 JavaScript 根本没使用过,别人一定把你当成从火星回来的吧! 很多使用过 JavaScript 的程序员,刚开始对其动态特性深恶痛绝,欲除之而后快,但是一旦熟悉这个语言以后,又会发疯般的爱上她(我的野蛮女友). 以创建一个"人"为例,

理解Javascript的动态语言特性_javascript技巧

Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行:javascript提供eval()函数,用于动态解释一段文本,并在当前上下文环境中执行. 首先我们需要理解的是eval()方法它有全局闭包和当前函数的闭包,比如如下代码,大家认为会输出什么呢? var i = 100; function myFunc() { var i = 'test'; eval('i = "hello."'); } myFunc(); alert(i

.NET下的动态代码编译探索

编译|动态 不能确定动态代码编译在什么地方是有意义的?一个普通情况就应该可以帮助阐明这个问题.假如你不得不从一个数据库中取出数据并将它放入另一个数据库.你应该只需使用一个SQL语句从源数据库中选取数据并插入目标数据库中,这只是小菜一碟,对不对?如果你正在拷贝生产数据以生成测试数据并需要改变数据以确保目标数据在以后开发中使用是安全的又将如何?你可能会构建一个数据传输系统(DTS)或某个其它传输机制,但是如果你这样做超过足够多的数据,这就会变成你每次为拷贝数据建立数据-擦除(data-scrubbi

Win8.1特性 探索Metro版IE的细节改进

  Win8.1的Metro IE相比原来系统的Metro IE也有三大改进,当你再次打开8.1的Metro版IE,有趣的变化就展现在我们面前,让我们来瞧一瞧. 新增特性一:双屏浏览 也叫分屏浏览,打开Metro IE,在选项卡略缩图上右键点击,弹出菜单后选择"在新窗口中打开选项卡",屏幕上就会自动变为双屏浏览,让用户可以同时浏览和操作两个不同的网站. 比如,下图,小编同时浏览"新浪"与"凤凰"两个首页,并且在两边同时不停打开和关闭各种页面也不卡

Silverlight 5 beta新特性探索系列:6.Silverlight 5新增低延迟声音效果类SoundEffect.支持wav音乐格式【附带源码实例】

在Silverlight 5中新增了一个SoundEffect类和SoundEffectInstance类用以加载wav格式的音乐,这样可以很及时的为动画添加音效. 现在我们看如何使用这两个类来控制播放wav音乐,首先引入mav音乐格式的文件(音频采样大小必须为16或者8位不能是24位,采用PCM编码,22.5, 44.1 or 48khz的采样率)如下图属性: 其次将引入的wav格式音乐文件在项目中右键点击其属性设置其"生成操作"为"内容",如下图所示: 现在我们

Silverlight 5 beta新特性探索系列:7.结合上层元素属性绑定和Style Setter上的绑定

   在Silverlight 5中添加了相对上层元素属性的绑定,还有Style Setter也可以绑定数据.         一.相对上层元素属性的绑定        它是在元素内部的子孙级元素中的某一些属性可以绑定为祖先级元素的某一些属性.比如说再一个ListBox的Tag元素值为:"这是第一个父级绑定",在ListBox.Templete下面添加一个TextBlock元素的Text属性设置为 <TextBlock Text="{Binding Tag,Relati

Silverlight 5 beta新特性探索系列:1.安装Silverlight 5 beta环境以及OOB模式下Silverlight 5 多窗口支持

Silverlight 5 beta版本总算于昨日放出,怀着激动的心情今天将开发环境更新为Silverlight 5 beta版本,并且接触Silverlight 5 beta的第一个新特性:OOB模式下的多窗口的弹出显示. 现在我们开始Silverlight 5 Beta版本的安装,首先需要为VS2010打一个VS2010 SP1补丁,然后我们再下载Silverlight 5 Beta Tools for Visual Studio SP1,一步一步安装完毕,最后我们下载Silverlight