- 浏览: 399215 次
- 性别:
- 来自: 上海
最新评论
-
liuwenlong62555:
...
Linux防火墙的关闭和开启 -
baolong101010:
永久关闭:chkconfig --level 2345 ipt ...
Linux防火墙的关闭和开启 -
lijie1819:
3)查看防火墙状态chkconfig iptables --l ...
Linux防火墙的关闭和开启 -
Annah:
总结的很好,谢谢
Vector和ArrayList区别 -
celavi:
非常好的文章,谢谢分享!
ORACLE SQL TUNING
5.6 自动共享内存管理
从Oracle 10g开始,Oracle提供了自动SGA的管理(简称ASMM,即Automatic Shared Memory Management)新特性。所谓ASMM,就是指我们不再需要手工设置shared pool、buffer pool等若干内存池的大小,而是为SGA设置一个总的大小尺寸即可。Oracle 10g数据库会根据系统负载的变化,自动调整各个组件的大小,从而使得内存始终能够流向最需要它的地方。
比如,假设某个系统,白天属于OLTP应用,因此会需要较多的buffer cache。而该系统在晚上属于DSS应用。对于DSS应用,很多的SQL语句由于都是进行全表扫描,因此都会采取并行方式完成。我们知道,并行时需要靠若干的从属进程完成工作,而从属进程会从large pool中进行分配。于是,晚上会需要较多的large pool。如果我们启用了ASMM,则数据库会根据负载的变化而自动的对内存大小进行调整,就不需要DBA进行手工调整了。
Oracle 10g提供了一个新的初始化参数:sga_target来启动ASMM,该参数定义了整个SGA的总容量。同时,初始化参数statistics_level必须设置为typical或all才能启动ASMM,否则如果设置为basic,则关闭ASMM。
ASMM只能自动调整5个内存池的大小,它们是:shared pool、buffer cache、large pool、java pool和stream pool。我们不再需要设置shared_pool_size、db_cache_size、large_pool_size、java_pool_size、streams_pool_size这五个初始化参数。而其他的内存池,比如log buffer、keep buffer cache等仍然需要DBA手工进行调整。
举例来说,假设我们将sga_target设置为500MB,表示SGA总容量为500MB。但是如果我们需要配置100MB的keep buffer cache,则必须手工设置参数db_keep_cache_size为100MB。同时如果设置参数log_buffer为3MB,那么shared pool、buffer cache等可以调整的5个部分的总容量就是397MB(500-100-3=397)。
Oracle 10g还提供了另一个初始化参数sga_max_size。sga_target的值不能超过sga_max_size的值,修改sga_max_size时,必须重启实例才能生效,而sga_target则可以在线修改,立即生效,无须重启实例。
为了实现ASMM,Oracle新引入了一个名为MMAN(Memory Manager)的后台进程。每隔很短的一段时间,MMAN进程就会启动,然后去询问一下Oracle提供的各个内存组件顾问,比如有buffer cache顾问,也有shared pool顾问,由这些顾问根据当前的负载情况,将这5个可以自动调整的内存池的、建议的大小尺寸,返回给MMAN。于是,MMAN进程就会根据该返回的值,来设置各个内存池。同时,如果我们使用了spfile,还会将这些顾问得出的建议值写入spfile里。这样,下次启动实例时,就可以直接把顾问得出的建议值拿来作为启动内存池的依据了。
如果我们启用了ASMM,同时又手工设置了可以自动调整大小的内存池的尺寸,比如设置了参数shared_pool_size为一个非0值的时候,会怎么样?对于Oracle 10g来说,我们为自动调整大小的内存组件设置了值,则会以我们设置的值作为自动调整的最小值。也就是说,假设sga_target为4GB,而我们将shared_pool_size设置为600MB,则MMAN在进行自动调整时,永远不会将shared pool设置为600MB以下。
实际上,为了使用ASMM,Oracle为这5个可自动调整的组件又提供了5个控制它们大小尺寸的参数,以“__”(两个下画线开头)。我们把当前的spfile导出到pfile里。
SQL> create pfile='/u01/init.ora' from spfile; SQL> !vi /u01/init.ora |
打开该pfile以后,我们会发现文件的前5行,会显示如下的内容(具体值可能不一样):
ora10g.__db_cache_size=134217728 ora10g.__java_pool_size=4194304 ora10g.__large_pool_size=4194304 ora10g.__shared_pool_size=62914560 ora10g.__streams_pool_size=0 |
可以看到,这5个初始化参数都以“__”开头,后面的部分与我们手工设置内存池大小的参数相同。比如__db_cache_size与db_cache_size对应等。这种以“_”开头的参数我们叫做隐藏参数。所谓隐藏参数,就是没有官方文档对其含义进行说明的参数。这种参数会根据版本的不同而发生改变。这5个隐藏参数(比如__shared_pool_size)由MMAN进程负责修改,而与之相对应的其他参数(比如shared_pool_size)则由DBA进行设定。因此,当我们启动数据库时,数据库内核会在初始化参数__shared_pool_size与shared_pool_size之间进行比较。如果shared_pool_size没有设定,或设定为0,或设定的值比__shared_pool_size小,则以MMAN自动调整的值来设置内存池的尺寸。否则,以DBA设定的值来设置内存池的尺寸。
如果我们在数据库运行过程中,修改了某个可自动调整的内存池的大小,这时会怎么样?如果我们设置的值比MMAN自动调整出来的值要大,则该内存池立即调整为设定的值的大小,同时我们所设定的值作为MMAN新的、自动调整的最小值;反之,如果设置的值比MMAN自动调整出来的值要小,则该内存池的大小不会变化,而我们所设置的值则只作为自动调整的最小值存在。比如,当前MMAN自动调整出来的shared pool大小为150MB,也就是__shared_pool_size为150MB,同时shared_pool_size为60MB。这时,如果我们将参数shared_pool_size从60MB设置为100MB的话,则shared pool的大小仍然为150MB,但是新设置的100MB将作为自动调整时的下限;如果我们将参数shared_pool_size从60MB设置为200MB,则shared pool立即扩张,从150MB扩张到200MB,同时200MB也将作为自动调整的新的下限。
我们来验证一下。视图v$sga_dynamic_components里记录了能够动态调整的各个内存池的大小。
SQL> SELECT component, current_size/1024/1024 size_mb 2 FROM v$sga_dynamic_components where component=' shared pool'; COMPONENT SIZE_MB ------------------------------------ ------------ shared pool 80 |
当前MMAN自动调整出来的shared pool大小为80MB。
SQL> alter system set shared_pool_size=70M; SQL> SELECT component, current_size/1024/1024 size_mb 2 FROM v$sga_dynamic_components where component=' shared pool'; COMPONENT SIZE_MB ------------------------------------ ------------ shared pool 80 |
我们将shared_pool_size设定为70MB,小于自动调整出来的值。可以看到,shared pool没有缩小,仍然是80MB。我们再将其从80MB扩大到100MB。
SQL> alter system set shared_pool_size=100M; SQL> SELECT component, current_size/1024/1024 size_mb 2 FROM v$sga_dynamic_components where component=' shared pool'; COMPONENT SIZE_MB ------------------------------------ ------------ shared pool 100 |
显然,只要我们设定的值比自动调整出来的值大,就会立即生效。
同时,如果当前我们启用了ASMM,同时并没有为这5个可以自动调整的内存池参数指定具体的值。当数据库在ASMM状态下运行一段时间以后,我们再禁用ASMM,会发生什么?我们来看下面的试验。
SQL> select name,value from v$parameter 2 where name in('shared_pool_size','db_cache_size',' java_pool_size','large_pool_size',' streams_pool_size'); NAME VALUE -------------------- -------------- shared_pool_size 96468992 large_pool_size 0 java_pool_size 0 streams_pool_size 0 db_cache_size 0 |
可以看到,除了shared pool为DBA指定以外(因为shared_pool_size大于0),其他的内存池都由ASMM指定。
SQL> select component, current_size FROM v$sga_dynamic_ components 2 where component like '%pool' or component= 'DEFAULT buffer cache'; COMPONENT SIZE_MB ---------------------------------- ----------- shared pool 138412032 large pool 4194304 java pool 4194304 streams pool 0 DEFAULT buffer cache 373293056 |
我们看到,ASMM根据当前的负载情况,为这5个内存池指定了大小。
SQL> alter system set sga_target=0; SQL> select name,value from v$parameter 2 where name in('shared_pool_size','db_cache_size',' java_pool_size','large_pool_size',' streams_pool_size'); NAME VALUE -------------------- -------------- shared_pool_size 138412032 large_pool_size 4194304 java_pool_size 4194304 streams_pool_size 0 db_cache_size 373293056 |
当我们将sga_target设置为0,从而禁用ASMM时,会发现,Oracle会自动将当前内存池的大小赋给对应的初始化参数(shared_pool_size、db_cache_size等)。同时我们也可以注意到,shared_pool_size的值也不再是DBA当时指定的96468992,而是被ASMM自动调整出来的138412032所覆盖。
发表评论
-
一次oracle无法open的解决
2009-01-16 13:59 3624这几天因为公司的复杂查询出现性能的问题(说实话本来就没设计好, ... -
如何改善Oracle的索引
2009-01-12 16:40 15301、速度因素 PARALLEL选项:当创建索引时,O ... -
Oracle latch竞争总结(一)
2009-01-07 11:38 2845在Oracle中,Latch的概念是非常重要的,v$l ... -
PX Deq: Execute Reply 案例说明
2009-01-03 09:55 30031 背景:Oracle 数据库在执行sql时,会自动的选择较 ... -
MySQL优化经验——第一讲
2008-12-28 19:41 1354今天突然想起自己 ... -
oracle中对workarea_size_policy和sort_area_size的总结
2008-12-19 12:06 8834在实际的工作中,想必很多人会对SORT_AREA_SIZE和s ... -
Oracle专用服务器与共享服务器的区别
2008-12-19 11:51 3353在建立Oracle数据库的时候,应该会在数据库建立助手向导上面 ... -
CBO学习笔记
2008-12-18 23:09 1401cost of b-tree access 这 ... -
Oracle高级SQL调优:CLUSTER_FACTOR案例研究
2008-12-18 22:27 1812大家在大型数据库生产系统的运维中可能会遇到这样一个问题,一条查 ... -
Oracle分析函数RANK()|ROW_NUMBER()|LAG()使用详解
2008-12-16 14:58 3071ROW_NUMBER()的使用方法: ROW_NUMB ... -
index和rowid的一点关系
2008-12-16 14:18 1465相信很多朋友在rowid和index之间都会有些疑问,今天在w ... -
关于MySQL的查询缓存收
2008-12-13 21:21 1164关于MySQL的查询缓存收 原理 QueryCache(下面简 ... -
oracle 被锁,解锁,阻塞语句
2008-12-12 18:35 2638//查询被锁的表 select A.s ... -
通过Oracle10g的FLASHBACK_TRANSACTION_QUERY指定事务的历史信息
2008-12-12 13:05 3143在数据库操作中,我们经常会遇到余下情况: 1.莫名其妙数据被D ... -
对于Oracle中DML使用UNDO的一些看法
2008-12-11 17:53 1219insert操作回滚段中只记录这些记录的ROWID updat ... -
oracle中x$ksppi和x$ksppcv详解
2008-12-09 17:22 3356SQL> desc x$ksppi 名称 ... -
ORA-600 [2103]错误及CF enqueue竞争
2008-12-09 17:21 1203昨天,客户的一套Oracle 10.2.0.3 RAC环境遇到 ... -
Oracle的redo 和undo的区别
2008-12-05 15:26 2586redo--> undo-->datafile i ... -
从 v$session 视图获取客户端 IP 地址
2008-11-18 19:42 2618缺省从 v$session 中不能直接获得客户端 IP ... -
oracle中聚合函数RANK和dense_rank的使用
2008-04-18 17:23 1342聚合函数RANK 和 dense_rank ...
相关推荐
自动管理共享内存:概览 8-14 自动管理共享内存的好处 8-15 ASMM 的工作原理 8-16 使用 Database Control 配置 ASMM 8-17 手动配置 ASMM 8-18 自动优化的 SGA 参数的行为 8-21 手动优化的 SGA 参数的行为 8-22...
进程全局区(Process Global Area,PGA) 用户全局区(User Global Area,UGA) 系统全局区(System Global Area,SGA) 固定SGA 重做缓冲区 块缓冲区缓存 共享池 ...自动SGA内存管理 自动内存管理 小结
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. ...
2.3.9 Oracle 10g自动检查点调整 75 2.3.10 检查点信息及恢复起点 78 2.3.11 正常关闭数据库的状况 78 2.3.12 数据库异常关闭的情况 80 2.3.13 数据库并行恢复案例一则 82 2.3.14 判断一个死事务的恢复...
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 4.2.4 共享池 145 4.2.5 大池 148 4.2.6 Java池 149 ...
3.2.1 共享内存参数 73 3.2.2 信号量参数 74 3.2.3 最大文件句柄数 75 3.2.4 网络参数 76 3.2.5 Oracle用户能够打开的文件句柄的最大数 77 3.2.6 Oracle用户能够执行的进程的最大数 78 3.3 磁盘管理 79 3.3.1 磁盘...
Bob Bryla是Oracle 9i和10g的认证专家,他在数据库设计、数据库应用程序开发、培训和Oracle数据库管理等方面拥有20多年的工作经验,他也足Dodgeville的Land'End公司的首席Internet数据库设计师和Oracle DBA. ...
2. oracle11G自带一个卸载批处理\app\Administrator\product\11.2.0\dbhome_1\deinstall\deinstall.bat 3. 运行该批处理程序将自动完成oracle卸载工作,最后手动删除\app文件夹(可能需要重启才能删除) 4. 运行...
有近20年使用Oracle技术产品以及Oracle数据库管理员/Oracle数据库应用管理员的经验,是真正应用集群、性能调优以及数据库内部属性方面的专家。同时是一位演讲家及Oracle ACE。 JARED STILL 从1994年就开始使用...
SGA区是由Oracle分配的共享内存结构,包含一个数据库实例共享的数据和控制信息。当多个用户同时连接同一个实例时,SGA区数据供多个用户共享,所以SGA区又称为共享全局区。用户对数据库的各种操作主要在SGA区中进行。...
值范围: Oracle8i National Language Support Guide 中指定的任何有效的10 字节字符串。 默认值: 从 NLS_TERRITORY 中获得 nls_date_language: 说明: 指定拼写日期名, 月名和日期缩写词 (AM, PM, AD, BC) 的语言。...
充分利用内存,优化sga、pga等(11g已经实现了sga+pga自动化,但有的时候仍然需要手动进行调整),适当的将小表keep到cache中。 4.优化sql语句 1)减少对数据库的查询次数,即减少对系统资源的请求,使用快照和显形图...
//查看内存信息两部曲: # lsdev -C | grep mem mem0 Available 00-00 Memory # lsattr -El mem0 size 1024 Total amount of physical memory in Mbytes False goodsize 1024 Amount of usable physical memory in ...
在Oracle应用程序的开发过程中,访问数据库对象和编写SQL程序是一件乏味且耗费时间的工作,对数据库进行日常管理也是需要很多SQL脚本才能完成的。Quest Software为此提供了高效的Oracle应用开发工具-Toad(Tools of ...
[client] port = 3306 socket=/home/mysql/data...myisam_max_sort_file_size = 10G # 如果临时文件会变得超过索引,不要使用快速排序索引方法来创建一个索引。注释:这个参数以字节的形式给出 myisam_repair_threads ...