ORACLE数据库学习之数据库的优化(四)

2014-11-24 17:07:31 · 作者: · 浏览: 5
k / total

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