1.自由范围的碎片计算:
自由空间碎片是由几部分组成,如范围数量.最大范围尺寸等,我们可用FSFI--FreeSpaceFragmentationIndex(自由空间碎片索引)值来直观体现:
FSFI=100*SQRT(max(extent)/sum(extents))*1/SQRT(SQRT(count(extents)))
----可以看出,FSFI的最大可能值为100(一个理想的单文件表空间).随着范围的增加,FSFI值缓慢下降,而随着最大范围尺寸的减少,FSFI值会迅速下降.
----下面的脚本可以用来计算FSFI值:
remFSFIValueCompute
remfsfi.sql
columnFSFIformat999,99
selecttablespace_name,sqrt(max(blocks)/sum(blocks))*(100/sqrt(sqrt(count(blocks))))FSFI
fromdba_free_spacegroupbytablespace_nameorderby1;
spoolfsfi.rep;
/
spooloff;
在一个有着足够有效自由空间,且FSFI值超过30的表空间中,很少会遇见有效自由空间的问题.当一个空间将要接近可比参数时,就需要做碎片整理了.
2.自由范围的碎片整理
----(1)表空间的pctincrease值为非0
----可以将表空间的缺省存储参数pctincrease改为非0.一般将其设为1,如:
altertablespacetempdefaultstorage(pctincrease1);
----这样SMON便会将自由范围自动合并.也可以手工合并自由范围:altertablespacetempcoalesce;
3.段的碎片整理:这种方法可用于整个数据库.
要查看段的有关信息,可查看数据字典dba_segments,范围的信息可查看数据字典dba_extents.如果段的碎片过多,将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建,然后将旧表中的数据插入到新表,同时删除旧表.这个过程可以用Import/Export(输入/输出)工具来完成.
----Export()命令有一个(压缩)标志,这个标志在读表时会引发Export确定该表所分配的物理空间量,它会向输出转储文件写入一个新的初始化存储参数--等于全部所分配空间.若这个表关闭,则使用Import()工具重新生成.这样,它的数据会放入一个新的.较大的初始段中.例如:
expuser/passwordfile=exp.dmpcompress=Ygrants=Yindexes=Ytables=(table1,table2);
----若输出成功,则从库中删除已输出的表,然后从输出转储文件中输入表:
impuser/passwordfile=exp.dmpcommit=Ybuffer=64000full=Y
----1.CPU参数
----CPU是服务器的一项重要资源,服务器良好的工作状态表现为在工作高峰时CPU的使用率高于90%.如果空闲时间CPU使用率就在90%以上,说明服务器缺乏CPU资源;如果工作高峰时CPU使用率仍然很低,则说明服务器CPU资源还比较充足.
----使用操作命令可以看到CPU的使用情况,一般Unix操作系统的服务器,可以使用sar-u命令查看CPU的使用率;NT操作系统的服务器,可以使用NT的性能管理器来查看CPU的使用率.
----数据库管理员可以通过查看v$sysstat数据字典中的“CPUusedbythissession”统计项得知Oracle数据库使用的CPU时间;查看“OSUserlevelCPUtime”统计项得知操作系统用户状态下的CPU时间;查看“OSSystemcallCPUtime”统计项得知操作系统系统状态下的CPU时间,操作系统总的CPU时间就是用户状态和系统状态时间之和.如果Oracle数据库使用的CPU时间占操作系统总CPU时间的90%以上,就说明服务器CPU基本上被Oracle数据库使用着,这是合理的,反之,则说明服务器CPU被其他程序占用过多,Oracle数据库无法得到更多的CPU时间.
系统全局区(SGA)是一个分配给ORACLE包含ORACLE数据库实例控制信息的内存段.SGA的大小对系统性能的影响极大,其缺省参数设置只适用于配置很低的计算机,不适应收入系统现有设备的需要.这些参数若不作调整,会对系统资源造成巨大浪费.就收入系统的Alpha1200而言,SGA的大小以160兆左右为宜.
初始化参数文件中的一些参数对SGA的大小有决定性的影响.参数DB-BLOCK-BUFFERS(SGA中存储区高速缓存的缓冲区数目),参数SHARED-POOL-SIZE(分配给共享SQL区的字节数),是SGA大小的主要影响者.
DB-BLOCK-BUFFERS参数是SGA大小和数据库性能的最重要的决定因素.该值较高,可以提高系统的命中率,减少I/O.每个缓冲区的大小等于参数DB-BLOCK-SIZE的大小.ORACLE数据库块以字节表示大小.
OracleSGA区共享池部分由库高速缓存.字典高速缓存及其他一些用户和服务器会话信息组成,共享池是最大的消耗成分.调整SGA区各个结构的大小,可以极大地提高系统的性能.
.调整LibraryCache
库高速缓存(LibraryCache)中包含私用和共享SQL区和PL/SQL区.调整SGA的重要问题是确保库高速缓存足够大,以使ORACLE能在共享池中保持分析和执行语句,提高语句分析和执行效率,降低资源消耗.通过比较LibraryCache的命中率来决定它的大小.查询V$LIBRARYCACHE数据字典视图(其中,pins表示高速缓存命中率,reloads表示高速缓存失败)
SQL〉SELECTSUM(pins),SUM(reloads),sum(reload)/sum(pins)FROMv$librarycache;
如果sum(reload)/sum(pins)≈0,说明LibraryCache的命中率比较合适,若大于1,则需要增加共享池(SHARED-POOL-SIZE)的大小(在初始化参数文件中).
.调整数据字典高速缓存(DictionaryCache)
数据字典高速缓存包括了有关数据库的结构.用户.实体信息等.数据字典的命中率对系统有很大的影响.命中率的计算中,getmisses表示失败次数,gets表示成功次数.
查询V$ROWCACHE表:
SQL>SELECT(1-(SUM(getmisses)/(SUM(gets)+SUM(getmisses))))*100FROMv$rowcache;
如果该值>90%,说明命中率合适.否则,应增大共享池的大小.
.调整数据库缓冲区高速缓存
Oracle在运行期间向数据库高速缓存读写数据,高速缓存命中表示信息已在内存中,高速缓存失败意味着ORACLE必需进行磁盘I/O.保持高速缓存失败率最小的关键是确保高速缓存的大小.初始化参数DB-BLOCK-BUFFERS控制数据库缓冲区高速缓存的大小.可通过查询V$SYSSTAT命中率,以确定是否应当增加DB-BLOCK-BUFFERS的值.
SQL>SELECTname,valueFROMV$SYSSTAT
WHEREnameIN(’dbblockgets’,’consistentgets’,’physicalreads’);
通过查询结果
命中率=1-physicalreads/(dbblockgets+consistentgets)
如果命中率<0.6~0.7,则应增大DB-BLOCK-BUFFERS.
(2)调整磁盘I/O
磁盘I/O是系统性能的瓶颈,解决好磁盘I/O,可明显提高性能.通过查询V$FILESTAT可以知道每个物理文件的使用频率(phyrds表示每个数据文件读的次数,phywrts表示每个数据文件写的次数)
SQL>SELECTname,phyrds,phywrtsFROMv$datafiledf,v$filestatfsWHEREdf.file#=fs.file#;
对于使用频率较高的物理文件,可以采用以下策略:
.将I/O尽可能平均分配在尽可能多的磁盘上.
.为表和索引建立不同的表空间.
.将数据文件与重做日志文件分离在不同的磁盘上.
.减少不经oracleSERVER的磁盘I/O.
(3)调整竞争
当多个进程对相同的资源发出申请时,产生竞争.
.修改process参数
该参数定义可以同时连接到oracle数据库的最大进程数,缺省值为50.注意,oracle的后台进程也包括在此数目中,建议将该值改为200.
.减少调度进程的竞争
减少调度进程的竞争,通过查询v$dispatcher表来判定调度进程的竞争
SQL>SELECTnetwork,sum(busy)/sum(busy)+sum(idle)FROMv$dispatcherGROUPBYnetwork;
如果某种协议忙的比率超过50%,应增加MTS-DISPATCHERS的值.
.减少多线程服务进程竞争
首先查询V$SYSSTAT表判定是否发生多线程服务进程竞争:
SQL>SELECTDECODE(totalq,0,’Norequest’,wait/totalq||’hunderthsofseconds’)FROMV$sysstatWHEREtype=’common’;
如果共享服务进程数量已达到初始化参数文件中MTS-MAX-SERVERS指定的最大值,但应用运行时,平均请求等待时间仍持续增长,那么,应加大MTS-MAX-SERVERS的值.
.减少重做日志缓冲区竞争
通过查询V$SYSSTAT表判定redolog文件缓冲区是否足够.
SQL>SELECTname,valueFROMv$sysstatWHEREname=’redologspacerequest’;
此处value的值应接近于0,否则,应增大初始化参数文件的LOG-BUFFEQS的值.
.减少回退段竞争
回退段对性能也有影响,根据事物大小情况来分配合适的回退段.
首先判定回退段的数量能否满足系统运行的需要:
查询V$WAITSTAT表与V$SYSSTAT表
SQL>SELECTclass,countFROMv$waitstat
WHEREclassIN(’systemundoheader’,systemundoblock’,’undoheader’,’undoblock’);
SQL>SELECTsum(value)FROMv$sysstatWHEREnameIN(’dbblockgets’,’consistentgets’);
如果任何一个class/sum(value)>10%,那么考虑增加回退段.回退段的数量一般按如下规律设定:
用户数回退段个数
n<164
16 32<=nn/4但不超过50
.减少FreeList竞争
当多个进程同时向一个表中插入数据时,产生FreeList竞争.
SQL>SELECTclass,countFROMv$waitstatWHEREclass=’freelist’;
SQL>SELECTsum(value)FROMv$sysstatWHEREnameIN(’dbblockgets’,’consistentgets’);
如果class/sum(value)>1%,则应增加该表的FreeList的值.