readsrollback header waits =undo header / total reads
rollback block waits = undo block / total reads
若任何一个的比率大于1%则建议再创一个回滚段:
create rollback segment rbs21 tablespace rbs storage (inittial 10koptimal 20k next 10k maxextents 8) ;
避免动态分配空间
用以下语句检查回滚段的动态分配:
select name,shrinks from v$rollstat,v$rollname wherev$rollstat.usn=v$roll ;
NAME SHRINKS
---------------- ----------
SYSTEM 0
RBS0 100
RBS1 1
若动态分配次数较多可增大回滚段的初始容量。
ALTER ROLLBACK SEGMENT RBS0
STORAGE (inittial 20k optimal 40k next 10kmaxextents 8) ;
优化Redo日志
检测Redo日志缓冲区锁存:
select name,value from v$sysstat
where name = 'rado log space requests' ;
value值应接近0若较大则应加大INITXXX.ORA中的LOG_BUFFER项的值。
减少Redo日志转储I/O争用:
将Redo日志分布在不同磁盘中。
1. 优化系统全局区(SGA)
调整操作系统的内存需求
减少页的换入换出;
将SGA置于主存之中
使用SGA的主要目的是为了在内存中存储数据,以利于快速访问。通过设置初始化参数PRE_PAGE_SGA=YES,在数据库启动时,可以将整个SGA读入内存,这样会减少在启动后ORACLE达到全部性能的总的时间。
使用如下命令可以查看SGA所分配的内存以及其内部的结构:
SVRMGR> SHOW SGA
Total System Global Area 107720688 bytes
Fixed Size 69616bytes
Variable Size 90701824bytes
Database Buffers 16777216 bytes
Redo Buffers 172032 bytes
为单个用户分配足够的内存
调整redo log缓冲区
参数LOG_BUFFER指定了REDO LOG的缓冲区的保留大小。LOG写进程(LGWR)在该缓冲区被填充时总是运行的,在新的LOG进入缓冲区时,原来的LOG应已经写入磁盘。
调整私有sql和pl/sql区
标识不必要的语法分析调用
1.在sql跟踪工具有效时运行应用
2.查看视图V$SQLAREA view
SVRMGR> select sql_text,parse_calls,executions from v$sqlarea ;
如果parse_calls值接近execution值,可能就是不断地对sql语句进行语法分析
3.执行如下查询:
select *from v$statname where name in (‘parse_count(hard)’,’execute_count’);
其结果类似于:
statistic#, name
----------------------------------
1.parse_count
1.execute_count
然后执行如下查询:
select * from v$sesstat where statistics# in(90,100) order by value , sid ;
减少不必要的语法分析调用
初始化参数open_cursors的最大值依赖于操作系统,最少值为5
调整共享池
数据字典或库快存的没有命中,其开销大大多于缓冲快存的没有命中,因此,首先应该为共享池分配足够的空间。
使用如下语句可以确定库快存和数据字典快存的命中率:
select(sum(pins-reloads))/sum(pins)“Lib Cache”from v$librarycache;
select(sum(gets-getmisses-usage-fixed))/sum(gets)“Row Cache”from v$librarycache;
共享池中的自由内存可以查看:
select * fromv$sgastat where name=’free memory’;
当然,如果共享池满了并不一定存在问题,只要上面所说的比率接近于1,就不需要增加共享池大小;
如果自由内存接近于0而且库快存或数据字典快存的命中率小于0.95,那么需要增加共享池的大小。
调整Library Cache
1.检查库快存的活动
select sum(pins) “Executions”,sum(reloads)”CacheMisses while Executing” from v$librarycache ;
“Executions”列指明sql语句,pl/sql块和实体定义被访问执行了的次数,”Cache Misses whileExecuting”指明其中没有命中的次数。
2.减少库快存的非命中
1.分配更多的库快存(可以增加初始化参数shared pool size的值;为了利用增加的共享sql区,增加初始化参数open cursors的值);
2.尽可能使用标准的sql语句(sql语句或pl/sql块必须一致,包括字符和空格;sql语句或pl/sql块中对schema实体的引用必须解析到同一schema的同一对象;sql语句中试用的变量的名字和数据类型必须匹配;sql语句必须使用相同的优化方法和优化目标);
尽可能使用标准的sql语句,策略:
语句中尽量使用变量而不要使用常量
确保应用用户不会改变优化方法和目标
标准化的变量命名和空格转换
尽可能使用存储过程
1.使用cursor_space_for_time加速共享sql区的访问:该参数指定是否共享sql区可以释放,如果为false(默认值),一个共享sql区就可以被释放;如果为true,一个共享的sql区只存在所有与其相关的游标关闭后才可以被释放。
如果库快存在语句执行时有非命中,不要将其设置为true,否则对新的sql语句将没有空间。
调整Data Dictionary Cache
1.监视数据字典快存的活动
select sum(gets) “Data Dictionary Gets”,sum(getmisses) “Data Dictionary Cache Get Misses” from v$rowcache ;
2.减少数据字典快存的非命中
对频繁访问的数据字典快存没命中和命中比应少于10%-15%。
要增加数据字典快存可用的内存数,需要增加初始参数shared_pool_size的值。
调整多线程服务器的共享池
查询动态表v$sesstat可以确定会话信息的大小:
select sum(value)||‘bytes’”Total memory for all sessions” from v$sesstat, v$statname wherename=’session uga memort’ and v$sesstat statistic#=v$statname.statistic#;
显示信息如下:
T