asmm简化了sga的配置.过去,你要手工指定分配给数据库buffer cache,shared pool,Java pool和large pool的大小.
这通常都是一个挑战.假如设置不够大,会导致性能很差,和内存溢出错误,假如设置过大,会导致浪费内存.
这个特性可以让你指定所有sga组件的总大小.Oracle数据库有周期的重新分配这些内存.
在以前的版本中,你不能对sga的总大小进行控制,因为内存的固定的,对其它的内部元数据进行分配,除了这个总大小就是用户指定的sga参数,额外的内出通常是10到20m.
新的sga初始化参数sga_target报告sga所有的内存,包括自动设置组件的,手工设置组件还有启动的时候的其它内部分配.
数据库控制和asmm
你可以使用db control来配置asmm
1.点治理
2.在实例部分选内存参数
3.选sga
4.在asmm点enable,然后输入总的sga大小.
手工配置
自动治理的只有四个部分
db buffer cache
shared pool
large pool
java pool
你可以通过设置sga_target来配置asmm.
假如你为sga_target设置了非零值,下面四个内存池是自动配置大小的:
database buffer cache
shared pool
large pool
java pool
假如你把sga_target设置为零,asmm关闭了.默认的值就是0.
在过去的版本中的单独参数没有作废.
下面的参数还是手工设置大小的:
log buffer
other buffer caches(keep/recycle,other block sizes)
streams pool
fixed sga和其它的内部分配的
自动调整sga参数的行为
当sgs_target没有设置或设置为零的时候
-自动调整的参数向以前那样
-例外:shared_pool_size
select sum(bytes)/1024/1024 from v$sgastat
where pool= 'shared pool';
当sga_target设置了
-默认的自动设置的参数为0
-假如非零值就是下限
假如sga_target没有设或等于零,自动调整的sga参数就向以前的一样.然而,shared_pool_size是个例外:内部分布的元数据(例如用在进程和会话数据)现在已经包括在shared_pool_size参数中.这样,你为了分配这些内存,当升级你的oracle 10g数据库的时候需要加大你的shared_pool_size参数.例如,假如你在以前的版本中的共享池是256m,你的内部分配是32m,那为了得到同样的效果,在你的10g数据库中要设置为288m.上面的查询计算包括内部分配的shared_pool的大小.在运行升级之前,你首先要进行这次查询.
当sga_target设为非0,自动调整的参数默认都是0.他们的大小都是通过asmm算法自动设置的.例如,sga_target设为8g,shared_pool_size是1g,这样就告诉asmm算法不会把共享池设为1g以下,尽管更大的值更好.你也可以使用下面的查询看自动调整组件的大小.
select component,current_size/1024/1024
from v$sga_dynamic_components;
手工调整sga参数的行为
一些组件不是自动调整的:
-keep 和recycle 缓冲区
-块倍数的缓冲
-log 缓冲
-streams池
这些参数是用户指定的
精确的控制这些组件的大小
使用v$parameter视图
select name,value,isdefault
from v$parameter
where name like '%size';
重新设置sga_target的大小
sga_target初始化参数
是动态的
最大可以是sga_max_size的大小
可以减少到所有组件的最小值
sga_target影响仅仅是自动调整的组件
sga_target是动态参数,可以通过db control或alter system命令修改.
sga_target最大可以是sga_max_size的大小.它可以减少到任一个自动调整的组件到达了最小值,要么是用户指定的最小值,
要么是内部决定的最小值.
假如你增加sga_target的大小,增加的内存根据自动调整的测量分布到自动调整的组件上.
假如你减小sga_target的大小,内存就通过自动调整测量从一个或多个自动调整组件上取消.这样,sga_target的变化仅影响自动调整组件的大小.
取消自动共享内存治理
设置sga_target为零取消自动调整
自动参数设置为他们的值
sga的大小不影响
你可以动态的设置sga_target为零来取消自动共享内存治理.这个时候,所有的自动调整的参数都是相应组件当前的大小,即使用户早期设置了不同的非0值.
手工的改变动态sga参数的大小
对于自动调整的参数,手工的改变它的大小:
假如新的值的比当前的值大,马上就会生效.
假如新的值比当前值小,就会改变到最小值
手工改变参数的大小影响sga的可调部分
当重新设置了sga_target的大小的时候,只有新值比当前组件的值大的时候才会马上改变.假如你设置sga_target为8g,设置shared_pool_size为2g,你确信为了容纳必要的内存,共享池至少2g.当你把共享池调为1g的时候,不会马上改变共享池的大小.它只会告诉自动内存调整算法在需要的时候,会把共享池改为1g.另外,假如一开始共享池是1g,你把它设置为2g,那么马上就生效.在重新改变操作中使用的内存是从一个或几个其它的自动调整的组件中得到了,手工的组件不受影响.
手工改变大小的组件也可以动态的修改,但是他们的不同就是马上就是设置的值.这样,假如手工组件的值增加,额外的内存就是从一个或多个自动调整的组件中获得的.假如手工组件的值减少了,释放出来的内存就给了自动调整大小的组件.
自动优化统计收集:概览
oracle8i提供dbms_stats包
dba决定怎么去收集统计
dba决定什么时候去收集统计
oracle9i决定怎么去收集统计
统计可以使用单个命令仅此收集
dba决定什么时候去收集统计
oracle10g完全自动收集统计的
dba不用去收集统计
默认就进行表监控
为了查询优化器产生更好的执行计划,在对象上必要有合法的统计.在过去,统计收集(或让作业去做)是典型的dba的责任.另外,有必要对改变的对象进行跟踪,来看什么时候有必要进行统计收集.假如对象的统计很陈旧或没有统计,就可能产生无效的sql执行计划.
在oracle9i(假定使用了监控)下面的dbms_status命令可以用来产生相应的统计"
dbms_stats.gather_schema_stats(schema_name,options='GATHER AUTO');
这个命令收集优化的统计,包括柱状图,对那些对象那些当前的统计是陈旧的.然后,你必须打开监控,并且有计划的执行这个命令.
在oracle10g中,自动优化统计收集自动这些任务,减少了你的收集统计的必要.
这个特性减少了由于sql语句统计失效或陈旧而导致性能很差的可能性,通过提高查询优化器的最家的输出提高了sql执行的性能.
GATHER_STATS_JOB
默认的,在数据库创建的时候就创建了gather_stats_job,执行dbms_stats.gather_database_stats_job_proc过程,使用schedular.
默认的定义了两个窗口.
WEEKENIGHT_WINDOW定义在下午10点到上午六点.从周一到周五.
WEEKEND_WINDOW定义从上午12电到周一12点.
默认的,MAINTENANCE_WINDOW_GROUP组包含这两个窗口也已经邓菁来源.
gather_stats_job使用特定的计划任务叫auto_tasks_job_class.这个类是自动创建的,而且跟特性的资源消费者组联系,这个消费者组叫做auto_task_consumer_group.这样确保任务使用auto_task_consumer_group.假如你想控制gather_stats_job的资源使用,你之需要为maintenance_window_group定义一个资源治理者组来为auto_task_cousumer_group分配资源.
为了让gather_stats_job工作正常,你必须确定statistics_level初始化参数设置为typical.
改变gather_stats_job的计划任务
你可以为定义的治理窗口来自定义开放时间.例如,你可以改变他们的时间间隔和重复的频度.你也可以添加资源计划到这些窗口中,来控制gather_stats_job使用的资源.
从db control主页,点击治理标签,然后在scheduler部分点击windows链接.就让你到了scheduler windows页.这里你可以选中一个窗口,并且可以点edit来修改它的特性.在这页,你还可以打开或关闭特定的窗口.只要你在下拉框为特定的窗口选择相应的行为,点ok就可以了.
锁定统计
阻止自动收集
主要用在可变的表中
-没有统计的锁定,意味着动态的取样.
-锁定代表值的统计
在oracle10g,你可以看到特定表的统计,通过新的dbms_stats包的lock_table_stats过程.你可以锁定一个表的统计,来阻止自动统计收集,这样你就可以使用动态的取样.你也可以在某个时间点锁定可变的表的统计,当它满了的时候.
你可以可以使用lock_schema_stats跑在sechma基本锁定统计.
你可以查看user/all/dba_tab_statistics视图来看stattype_locked列来看一个表是不是锁定了.
你也可以使用unlock_table