一、概述 在Oracle 10g中,与内存相关的参数可以归为两类: ◆自动调优的SGA参数:目前这些参数包括DB_CACHE_SIZE、SHARED_POOL_SIZE、LARGE_POOL_SIZE和JAVA_POOL_SIZE。 ◆手动SGA参数:这些参数包括LOG_BUFFER、STREAMS_POOL、DB_NK_CACHE_SIZE、DB_KEEP_CACHE_SIZE和DB_RECYCLE_CACHE_SIZE。
采用自动SGA内存管理时,确定自动调整组件大小的主要参数是SGA_TARGET,这个参数可以在数据库启动并运行时动态调整,最大可以达到SGA_MAX_SIZE参数设置的值(默认等于SGA_TARGET,所以如果想增加SGA_TARGET,就必须在启动数据库实例之前先把SGA_MAX_SIZE设置得大一些)。数据库会使用SGA_TARGET值,再减去其他手动设置组件的大小(如DB_KEEP_CACHE_SIZE、DB_RECYCLE_CACHE_SIZE等),并使用计算得到的内存量来设置默认缓冲区池、共享池、大池和Java池的大小。在运行时,实例会根据需要动态地对这4个内存区分配和撤销内存。 随着时间的推移,当实例的内存需求越来越确定时,各个SGA组件的大小也越来越固定。即便数据库关闭后又启动,数据库还能记得组件的大小,因此不必每次都从头再来确定实例的正确大小。这是通过4个带双下划线的参数做到的:__DB_CACHE_SIZE、__JAVA_POOL_SIZE、__LARGE_POOL_SIZE和__SHARED_POOL_SIZE。如果正常或立即关闭数据库,则数据库会把这些值记录到存储参数文件(SPFILE)中,并在启动时再使用这些值来设置各个区的默认大小。 另外,如果知道4个区中某个区的最小值,那么除了设置SGA_TARGET外,还可以设置这个参数。实例会使用你的设置作为下界(即这个区可能的最小大小),但是重要的一点要记住,这样Oracle就不能缩小相应区的大小到设定的最小值以下了。
SGA,PGA,UGA都是Oracle管理的内存区。
SGA(System Global Area),即系统全局区,Oracle中最重要的内存区。
PGA(Process Global Area),即程序全局区,一个进程的专用的内存区。
UGA(User Global Area),即用户全局区,与特定的会话相关联。
专用服务器连接模式,UGA在PGA中分配。
共享服务器连接模式,UGA在SGA中的Large Pool中分配。
如果采用专用服务器连接模式,PGA中包含UGA,其他区域用来排序,散列和位图合并。
简单来讲,PGA=UGA+排序区+散列区+位图合并区。
二、PGA的管理模式。
PGA分两种管理模式:
1) 手动PGA内存管理,用户指定排序区和散列区所使用的内存,每个连接使用相同的内存。
2) 自动PGA内存管理,告诉Oracle可以使用的PGA的总量,由Oraclce根据系统负载决定具体分配。
9iR1时默认为手动PGA内存管理,9iR2以后默认为自动PGA内存管理。
PGA内存可以动态扩大和回收。
PGA内存管理模式由WORKAREA_SIZE_POLICY控制。
1) 设为MANUAL,启用手动内存管理。
2) 设为AUTO,并且PGA_AGGREGATE_TARGET不为0时,启用自动内存管理。
三、手动PGA内存管理
有三个参数对PGA影响最大。
SORT_AREA_SIZE:对信息排序所用的内存总量
SORT_AREA_RETAINED_SIZE:排序后在内存中保存排序信息的内存总量。
HASH_AREA_SIZE:存储散列列表所用的内存量。
下面对这三个参数进行说明:
1) SORT_AREA_SIZE:
如果SORT_AREA_SIZE设为512KB,SORT_AREA_RETAINED_SIZE也为512KB,则Oracle使用512KB的内存进行排序,排序后所有数据都留在内存中。
2) SORT_AREA_RETAINED_SIZE:
如果SORT_AREA_SIZE设为512KB,SORT_AREA_RETAINED_SIZE设为384KB,则Oracle使用512KB的内存进行排序,然后保留384KB的已排序数据,另外512KB-384KB=128KB的已排序数据会写到临时表空间中。
如果SORT_AREA_RETAINED_SIZE没有设置,则它的值为0,但是实际保留的排序数据和SORT_AREA_SIZE相同。
3) HASH_AREA_SIZE:
一个大集合和另个集合进行连接时,会用到HASH_AREA_SIZE参数。较小的 表会放到这部分内存中作为驱动表,然后大表进行探索(PROBE)操作进行连接。如果HASH_AREA_SIZE过小会影响两个集合(表)连接时的性能。
注意点:
1) 如果需要排序的数据量大于SORT_AREA_SIZE,Oracle会分批进行排序。把当前已排序的数据保存到临时表空间中,然后对剩余的数据进行排序。最后,还会对这些保存在临时表空间中的已排序数据再进行排序,因为每次保存到临时表空间中的已排序数据只是部分数据的排序,对整体需排序的数据来说只是部分局部有序。
2) *_AREA_SIZE只是对某个操作的限制,一个查询可能有多个操作,每个操作都有自己的内存区。如果SORT_AREA_SIZE设为5MB,一个查询可能会有10个排序操作,这样一个查询会占用50MB的排序内存。
3) 3,*_AREA_SIZE内存的分配是按需分配。如果一个查询需要5MB内存进行排序,就算分配1G的SORT_AREA_SIZE也不会全部使用,只会使用需要的5MB的内存量。
四、自动PGA内存管理
要启用自动PGA内存管理,设置下列参数:
1,WORKAREA_SIZE_POLICY=AUTO
2,PGA_AGGREGATE_TARGET=非零
有关PGA_AGGREGATE_TARGET:
1) PGA_AGGREGATE_TARGET是一个目标值。连接数少的时候实际分配PGA内存会比它要小。连接数多的时候实际分配的PGA内存会比它要大,但是Oracle会努力保持总PGA保持在PGA_AGGREGATE_TARGET值内。
例如,PGA_AGGREGATE_TARGET 设为300MB。5个用户连接时,每个用户可能分配10MB的PGA内存,共分配50MB的PGA内存。300个用户连接时每个用户可能分配1.3MB的 PGA内存,共分配390MB的PGA内存。当用户连接多时,Oracle会降低每个用户的PGA内存使用量。
2) 一个串行查询(非并行查询)可能包括多个排序/散列操作,每个排序/散列操作最多使用5%的PGA内存。
3) 一个并行查询最多可用到30%的PGA内存,无论有多少并行进程。
五、手动PGA内存管理与自动PGA内存管理
自动PGA内存管理相对于手动PGA内存管理有很多优点
1, 当用户连接少时
a) 手动PGA内存管理不管有多少可用内存都按照预设值进行分配。比如当前空闲内存为300MB,连接需要10MB的内存进行排序,而我们设定的排序区大小为5MB,导致虽然有足够的空闲内存却无法分配给当前连接,造成执行效率低下。
b) 自动PGA内存管理会根据当前空闲内存来进行分配。当空闲内存为300MB,当前用户需要10MB内存进行排序,Oracle就会分配10MB内存给当前用户。
2, 当用户连接多时
a) 手动PGA内存管理会完全按照预设值分配内存。如果物理内存总量为1G,排序区设为5MB,当有300个用户连接时,Oracle会分配1.5G的内存,这已经超过了我们的实际物理内存!
b) 自动PGA内存管理会根据当前连接情况进行分配。如果物理内存总量为1G,PGA_AGGREGATE_TARGET为300MB,当用户数从10升到 300时,每个用户连接的内存会从满足需要的10MB慢慢减少到1.3MB,虽然最后总量也会超过PGA_AGGREGATE_TARGET,但比起手动 PGA内存管理要好很多了。
什么时候使用自动PGA内存管理?什么时候使用手动PGA内存管理?
白天系统正常运行时适合使用自动PGA内存管理,让Oracle根据当前负载自动管理、分配PGA内存。
夜里用户数少、进行维护的时候可以设定当前会话使用手动PGA内存管理,让当前的维护操作获得尽可能多的内存,加快执行速度。
如:服务器平时运行在自动PGA内存管理模式下,夜里有个任务要大表进行排序连接后更新,就可以在该操作session中临时更改为手动PGA内存管理,然后分配大的SORT_AREA_SIZE和HASH_AREA_SIZE(50%甚至80%内存,要确保无其他用户使用),这样能大大加快系统运行速度,又不影响白天高峰期对系统造成的影响。
六、操作命令
系统级更改:
ALTER SYSTEM SET WORKAREA_SIZE_POLICY = {AUTO | MANAUL};
ALTER SYSTEM SET PGA_AGGREGATE_TARGET=100000000;
ALTER SYSTEM SET SORT_AREA_SIZE = 65536 SCOPE = SPFILE;
ALTER SYSTEM SET HASH_AREA_SIZE = 65536 SCOPE = SPFILE;
会话级更改
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.50
Session级修改散列区为30mb所需时间
SQL> ALTER SESSION SET WORKAREA_SIZE_POLICY = MANUAL;
会话已更改。
已用时间: 00: 00: 00.01
SQL> ALTER SESSION SET HASH_AREA_SIZE = 30000000;
会话已更改。
已用时间: 00: 00: 00.01
SQL> select /*+ use_hash(tb1 tb2)*/ * from sorttable tb1,sorttable tb2 where tb1.object_id=tb2.object_id;
已选择49735行。
已用时间: 00: 00: 04.47
所需时间由40.50秒提升到4.47秒,效果同样很明显。
备注:以上实验皆执行全表扫描保证相关表读入缓冲区中,避免因数据没读入缓存造成误差。
结论:在9iR2版以后,PGA不再像以前那样困扰DBA了,Oracle会帮我们做好PGA的分配。但这并不意味着DBA不需要深入了解PGA了,掌握PGA并根据适当应用会让工作如虎添翼。
发表评论
-
Oracle ITL(事务槽)
2013-07-10 10:14 2374ITL描述: ITL(Interested Transac ... -
【转】Oracle TM锁 TX锁
2013-05-12 23:42 1411转自RuleV5:http://blog.csdn.net/ ... -
【转】Oracle: sqlnet.ora、listener.ora、tnsnames.ora的配置
2013-05-07 22:29 852转自 http://blog.csdn.net/wenlel ... -
v$parameter, v$parameter2, v$system_parameter, v$system_parameter2, v$spparamete
2013-05-07 15:05 1291转自:http://blog.csdn.net/huang_ ... -
SQL 连接(左连接,右连接,全连接,内连接,交叉连接,自连接) (转)
2013-02-02 23:10 1005最近公司在招人,同事问了几个自认为数据库可以的应聘者关于库连 ... -
Oracle 回收站 (转)
2013-02-01 17:19 766我们都比较熟悉windows中的回收站,文件删除后放到回收 ... -
ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
2011-03-13 14:02 720近日在配置Oracle 10G的 ... -
ORA-28000: the account is locked
2011-03-12 19:36 1775迁移项目,一切弄完后启动服务器,Hibernate报错:OR ... -
ORA-01578: ORACLE 数据块损坏 一种解决方案 (转)
2011-03-11 15:32 31433os: winxp db: 10g r2 错误提 ... -
oracle的备份与恢复 (转)
2011-03-11 14:28 1155oracle中的不使用rman的备 ... -
oracle 存储结构
2011-03-10 13:33 1812总体来说oracle的逻辑结构和物理结构是由块、区、段 ... -
pctused, pctfree, pctincrease , 行迁移 & 行链接 (转)
2011-03-09 19:48 1422关于pctincrease与空间 ... -
表空间管理 用户管理 日志文件管理
2011-03-08 14:09 7721、表空间管理和用户管理 --创建数据表 ... -
oracle initrans maxtrans
2011-03-07 10:35 3949initrans用于对数据块的行级并行操作的控制。首先介绍事 ... -
oracle analyze table(转)
2011-03-04 16:19 1507首先创建四个临时表t1 ... -
oracle 高水位线(转)
2011-03-04 14:30 2492高水位线实验: -- 创建test3表 SQL> cre ... -
Oracle SQL 优化 (转)
2011-03-03 15:16 671Oracle SQL的优化规则: 尽量少用IN操作符,基本上所 ... -
EXECUTE IMMEDIATE用法小解(转)
2011-03-03 14:33 634EXECUTE IMMEDIATE 代替了以前Oracle8i ... -
Oracle distinct的用法(转)
2011-03-03 09:37 802distinct这个关键字来过滤掉多余的重复记录只 ... -
oracle float(b)(转)
2011-03-02 14:48 1143今天有人问我,他把字段类型设计成float(2)后,插入数 ...
相关推荐
Oracle Oracle是一种对象关系数据库管理系统(ORDBMS)。...对memory的管理,Oracle 10g中不再区分data buffer,shared pool等,只分为sga与pga。Oracle 10g能根据数据库的负载情况,自动平衡各个部分。
本文是由笔者2012年学习oracle数据库时编写的学习札记,其中的题目 多数为老师留下的思考题目。 我相信本文会对初学者使用oracle有一个初步的使用印象。右图为我所参 考的书籍。 目录 第一讲 Oacle关系数据库 ...
Oracle11g数据库概述及新特性 Oracle 11g Enterprise Manager简介 SGA和PGA调优 使用RMAN工具 RAC安装、配置 Oracle11g体系结构 管理数据库用户和安全 I/O调优 RMAN的基本配置、恢复目录 自动存储管理ASM 创建和配置...
Oracle 11g体系结构深入剖析和运维管理(三)资源目录:【】19_buffer状态深入剖析【】20_使用各种SQL来熟知buffercache使用情况【】21_Oracle日志原理剖析【】22_Oracle日志核心意义_快速提交_写缓存【】23_logbuffer...
Oracle Database 10 g :为网格计算设计的数据库 1-7 数据库体系结构:概述 1-8 Oracle 内存结构 1-9 Oracle 进程 1-11 概述 Oracle 实例管理 1-12 物理数据库结构 1-14 Oracle Managed Files (OMF) 1-16 ...
在《Oracle11g从入门到精通》中将对Oracle的众多概念进行介绍,并介绍其在实际应用中的使用,例如段、盘区、数据块、表空间、系统全局区(SGA)和程序全局区(PGA)、分区、回退段、重做日志,联机日志、归档日志、...
火龙果软件工程技术中心 Oracle在简化内存管理方面过去几年做了巨大的努力,从Oracle9i通过PGA_AGGREGATE_TARGET参数实现PGA自动管理开始,Oracle10g通过SGA_TARGET参数实现了SGA的自动管理,Oracle11g更是惊人地...
Oracle Database 10 g :“g”代表网格 1-6 Oracle 数据库体系结构 1-8 数据库结构 1-9 Oracle 内存结构 1-10 进程结构 1-12 Oracle 实例管理 1-13 服务器进程和数据库缓冲区高速缓存 1-14 物理数据库结构 1-...
Bob Bryla是Oracle 9i和10g的认证专家,他在数据库设计、数据库应用程序开发、培训和Oracle数据库管理等方面拥有20多年的工作经验,他也足Dodgeville的Land'End公司的首席Internet数据库设计师和Oracle DBA. ...
进程全局区(Process Global Area,PGA) 用户全局区(User Global Area,UGA) 系统全局区(System Global Area,SGA) 固定SGA 重做缓冲区 块缓冲区缓存 共享池 大池 Java池 自动SGA内存管理 自动内存管理 小结
9.5.7 Oracle 10g/11g Latch机制的变化 467 第10章 性能诊断与SQL优化 471 10.1 使用AUTOTRACE功能辅助SQL优化 471 10.1.1 AUTOTRACE功能的启用 471 10.1.2 Oracle 10g AUTOTRACE功能的增强 473 10.1.3 ...
4.1.1 手动PGA内存管理 114 4.1.2 自动PGA内存管理 121 4.1.3 手动和自动内存管理的选择 131 4.1.4 PGA和UGA小结 132 4.2 系统全局区 133 4.2.1 固定SGA 137 4.2.2 重做缓冲区 137 4.2.3 块缓冲区缓存 138 ...
每一个Oracle的初学者在入门阶段都会接触到SGA/PGA的知识,如果是从10g开始学习那么会多或少会对 ASMM有所了解,从使用的角度来说ASMM的出现极大地简化了Oracle内存初始化参数的设置,在ASMM的使 用上高级DBA和初学...
5.1 PGA管理 5.2 SGA管理 5.3 Oracle的内存分配和使用 第6章 Buffer Cache与Shared Pool原理 6.1 Buffer Cache原理 6.2 Shared Pool的基本原理 第7章 重做(Redo) 7.1 Redo的作用...
5.1 PGA管理 5.2 SGA管理 5.3 Oracle的内存分配和使用 第6章 Buffer Cache与Shared Pool原理 6.1 Buffer Cache原理 6.2 Shared Pool的基本原理 第7章 重做(Redo) 7.1 Redo的作用...
5.1 PGA管理 5.2 SGA管理 5.3 Oracle的内存分配和使用 第6章 Buffer Cache与Shared Pool原理 6.1 Buffer Cache原理 6.2 Shared Pool的基本原理 第7章 重做(Redo) 7.1 Redo的作用...