Oracle彻底优化操作方法2


优化缓冲区
(1)获取缓冲区活动情况
为了优化缓冲区,首先应了解缓冲区的活动情况。这可以通过查询动态性能表(需有SELECT ANY TABLE特权)V$SYSSTAT来获得。
SVRMGR> select name ,value from v$sysstat
2> where name in(‘db block gets','consistent gets','physical reads');
NAME VALUE
db blockgets 3437
consistent gets 30500
physica reads 1963
3 rows selected.
其中,”db block gets”和”consistent gets”的值是请求数据缓冲区中读的总次数。”physical reads”为请求数据时引起从盘中读文件的次数。

(2)缓冲区命中率
从缓冲区读的可能性的高低称为缓冲区命中率。它可用如下公式计算:
Hot Ratio=1-(physical reads/(db block gets+consistent gets)
缓冲区命中率越高,其速度就越快。如果命中率低于60%或70%时。则应增加缓冲区(即DB_BLOCK_BUFFERS),以改进性能。
根据公式可以计算出本例中的Hot Ratio=1-(1963/(3437+30500)=92%。 如果缓冲区的命中率很高,希望在保持良好性能下适当减少缓冲区,
这时可减少DB_BLOCK_BUFFERS的值,其最小值为4。
当一个文件上的输入/输出(I/O)请求干扰了第二个文件的输入/输出请求时,那么这两个文件就会发生争用。
所以两个随机存取的文件只有在无可能同时存取它们时,才可以存放在同一设备中。由此可以分为两种类型的I/O争用:并行I/O争用和干扰争用。
并行I/O争用多发生在同一对同一设备请求多种存取时,这种类型的争用可以通过分离与表相联系的索引的办法来消除。
干扰争用发生在对一个顺序文件进行写操作而同时进行读命令时中断而引起。
I/O优化的目的是解决I/O瓶颈,I/O的优化必须在内存优化之后进行,可以通过减少磁盘争用、有效分配数据块空间和避免动态空间管理三个方面来优化I/O。

减少磁盘争用
V$FILESTAT视图提供有关物理读写的信息。物理I/O针对磁盘,逻辑I/O针对内存。如果有多个进程同时访问同-磁盘,就产个磁盘争用。
监控Oracle的磁盘活动
要解决磁盘争用,首先应该知道磁盘的活动情况,确定是否发生争用。这可以通过查询动态性能表(需有SELECT ANY TABLE特权)V$FILESTAT和V$DATAFILE来确定。例如:
SQL>SELECT Name,phyrds,phywrts
2>FROM V$DATAFILE df,V$FILESTAT fs
2>WHERE df.file#=fs.file#;
其中:
◆ phyrds:记录从盘上读每个文件的次数。
◆ phywrts:记录往盘上写文件的次数。
一个盘上总的I/O次数是该盘上所有文件的phyrds和phywrts之和。必须把物理读写的总量控制在用户硬件和操作系统的最优限制内。
监控操作系统磁盘的活动
2000 Server中可以通过”性能”工具来监控磁盘的活动,对VMS和Unix多数磁盘进行每秒40次以上的I/O是过度的,应当给予调节。

分布I/O以解决磁盘争用

(1)存放重做日志文件
重做日志文件是顺序写入磁盘的,所以尽量不要将重做日志文件跟数据文件存放在同一个磁盘上。
如果不得不将数据文件跟重做日志文件存放在同一个磁盘上,那么该盘空间不应该属于SYSTEM表空间、RBS表空间,以及其它如DATA和INDEX表空间。
它们都会直接导致与重做日志文件之间的争用,而且还会有增加写入日志读写速度的可能性。

(2)存放档案日志文件
在进行大量数据事务处理的时候,选择归档功能将会导致其与重做日志磁盘间的争用。而且当档案重做日志文件出现空间不够时,将会引起数据库的冻结。
所以档案日志文件不能与SYSTEM表空间、RBS表空间或INDEX表空间段存储在同一设备上,也不能与任何联机重做日志文件存放在同一设备上。
它只允许与一些小的、静态的文件存放到一起。

(3)存放数据代码文件
为了减少数据库文件和数据库代码之间的争用,应避免将数据库文件作为代码文件而放在同一磁盘中。
如果数据文件不得不放在同一磁盘设备中,那么应当将最不常用的数据文件放在那儿。

(4)减少非Oracle文件的I/O

(5)优化DBWR进程争用
数据库写进程(DBWR)、日志写进程(LGWR)与归档进程(ARCH)三种后台处理进程可以空闲存取磁盘上的数据库文件。
这三个进程之间常因同时读写争用而导致I/O争用,而DBWR进程还有自我争用发生的可能。通过对DBWR赋值可以有效的解决DBWR的自我争用
通常在操作系统中为每个实例创建多个DBWR进程,并通过初始参数DB_WRITERS来确定DBWR的个数。建议将赋值在n与2n之间,这里的n是指磁盘的个数。
如果赋值不能很好的解决DBWR的内部争用,可以通过异步I/O来减少DBWR的内部争用。由于I/O进程的执行都是并行的,所以异步的I/O仅需一个DBWR即可解决

(6)表数据存放策略
将大表的数据划分成若干小部分,并将这些部分存储在不同磁盘的不同数据文件中。
用create tablespace创建表空间,在datafile子句中指定数据文件,每个文件应在不同的盘上。如我们需要在三个磁盘上存放数据文件,可使用如下代码:
create tablespace trip
datafile ‘file_on_disk_1' size 500k,
‘file_on_disk_2' size 500k,
‘file_on_disk_3' size 500k;

(7)指定表空间和表大小
用”create table”创建表,在tablespace子句中指定表空间,在storage子句中指定表的大小,如以下SQL语句:
create table striptab (
……
Tablespace strip 1500k
Storage (initial 495k next 495k minextent 5 pctincreate 0);

(8)清除其它的磁盘I/O
数据块空间的分配
因数据库中的数据被存放在数据块中,因此如何分配数据块中的空间将直接影响其存取性能。
当用update语句更新一行数据时,可能使该行的数据增加,从而使其在一个数据块内容纳不下。
这时,Oracle就寻找能容纳下该行的数据块,如果能找到这样的块,便把该行全部存入新块中(这称为行移动)。
如果找不到能容纳该整行的数据块,则把该行切成若干片,然后把每一片分别存放在一个数据块中,于是这样的行被存放在多个数据块中,这种行称为链接行。
查询一个链接行则需要多次I/O操作,从而产生I/O瓶颈,这将降低数据的存取性能。
解决上述问题的办法是,使用带list chained rows选项的analyze命令来标出表或集中那些移动或链接的行,并将其集中在一个输出表中。
对于这些输出表中的链接行,可增加其数据块的大小,以提高数据存取性能。

减少在已有表中的迁移和链接行的具体步骤如下:

(1)用analyze命令收集信息:
analyze table *** list chained rows;

(2)查询输出表:
select * from chained_rows where table_name='test_chain';

(3)消除迁移行:
创造与已有表有相同列的中间表来持有迁移行和链接行:
create table int_***
as seelct * from *** where rowid in (select head_rowid from chained_rows where table_name='***');
从已有表中删除迁移行和链接行:
delete from *** where rowid in (select head_rowid from chained_rows where table_name='***');
把中间表中的行插入已有表中:
insert into *** select 8 from int_***;
撤消中间表:
drop table int_***;

(4)从输出表中删除第1步收集的信息:
delete from chained_rows where table_name='***';

(5)再次使用analyze命令,并查询输出表;

(6)在输出表中出现的任何行是链接行,可增加数据块长度。

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《Oracle彻底优化操作方法2
本文地址:https://www.zhiletu.com/archives-464.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微