Oracle优化之I/O解析(一)

1.DBWn进程会在以下两种情况下将“脏”数据写入磁盘中:


a)当服务进程扫描一定数量(阀值)的Buffer Cache后还没有找到干净、可重用的缓存块后,它会通知DBWn进程将“脏”数据写入文件中去,以释放出空闲缓存;
b)当发生检查点(Checkpoint)时。




2.LGWR进程触发的条件:
a)当一个事务提交(COMMIT)时;
b)每3秒钟写一次Log Buffer;
c)当Log Buffer到达1/3满时;
d)当DBWn进程将“脏”数据写入磁盘时;


3.何时用到临时表空间
a)临时表/索引
在会话中,当第一次对临时表进行insert时,oracle会从临时表空间中为临时表及其索引 临时空间来存储数据。
b)排序
用到排序的操作:JOIN、创建(重建)索引、order by、group by以及统计数据收集,首先在内存中的sort area进行(Sort In Memory),一旦Sort Area不足,就会使用临时空间进行排序(Sort In Disk)。排序区由sort_area_size控制。


c)临时LOB对象
LOB对象包括BLOB、CLOB、NCLOB、BFILE。在PLSQL程序块中,如果定义了LOB变量,则这些LOB变量就是临时LOB对象。临时LOB对象被创建在临时表空间上,直到LOB数据被释放,或者会话结束。




4.查找数据
a)FULL Table Scan
当查询条件无法命中任何索引、或者扫描索引的代价大于全表扫描代价的某一比例时(由参数optimizer_index_cost_adj设定),oracle会采用全表扫描的方式查找数据。
当发生全表扫描时,oracle会自下向上一次读取一定数量(由参数db_file_multiblock_read_count设定)的数据块,一直读取到高水位标志(HWM,High Water Mark)下。
Full Table Scan 会引起db file scattered read(离散读) 事件。


b)INDEX UNIQUE SCAN
当索引为UNIQUE索引时,每个叶子节点只会指向一条数据,如果oracle能预知扫描结果只有0或者1条记录2,会采用INDEX UNIQUE SCAN,当对Unique Index中的所有字段进行完全匹配时,会发生INDEX UNIQUE SCAN.


c)INDEX RANGE SCAN
如果通过索引查找数据时,oracle认为会返回数据可能会大于1,会进行INDEX RANGE SCAN。
INDEX RANGE SCAN分为闭包(有前后查找边界)和非闭包(只有一边或者没有边界)。返回数据会依据索引增序排序,多个相同值则会按照ROWID的增序排序。


INDEX UNIQUE SCAN 和INDEX RANGE SCAN 都会引起db file sequential read(顺序读)事件。


d)TABLE ACCESS BY INDEX ROWID
当发生索引扫描时,如果需要返回的字段都在索引上,则直接返回索引上的数据,而如果还需要返回非索引上的字段的值,orale则需要根据从索引上查找的ROWID到对应的数据块上取回数据,这时就是TABLEACCESS BY INDEX ROWID。


e)INDEX FAST FULL SCAN && INDEX FULL SCAN
索引快速全扫描和全表扫描类似,一次读取db_file_multiblock_read_count个数据块来扫描所有索引的叶子节点。INDEX FAST FULL SCAN和其他索引扫描不同,它不会从树的根节点开始读取,而是直接扫描索引叶子节点;也不会一次读取一个数据块,而是一次读取db_file_multiblock_read_count个数据块。
INDEX FAST FULL SCAN会引起db file scattered read 事件。


在某些情况下,如db_file_multiblock_read_count值过小、强制使用索引扫描时,会发生INDEX FULL SCAN。INDEX FULL SCAN和INDEX FAST FULL SCAN不同,它是一种索引扫描,按照B-Tree的查找法从树的根节点开始扫描,遍历整棵树,并且一次读取一个数据块。
它会引起db file sequential read事件。


二、
2.1、文件系统(file system) 和裸设备(Raw device)
在文件系统中,os为了提高读写效率,会为文件系统开辟一块Buffer cache用于读写数据的缓存。这样,oracle的数据会被缓存2次(oracle的Buffer cache和os的Buffe cache)。
为了避免os的这次缓存,我们可以采用raw作为数据文件的存储设备。
裸设备,也称为裸分区(Raw Partition),它是一个没有被加载(mount)到os的文件系统上,也没有加载到oracle集群文件系统(OCFS,Oracle Cluster File System)的磁盘分区,它通过字符设备驱动来访问。
裸设备的文件读写不由os控制,而是由应用程序(如Oracle RDBMS)直接控制。




2.2Direct IO && Concurrent IO
除了裸设备,某些文件系统可以支持Direct IO,以避开读写缓冲。如果要使用Direct IO,需要指定Oracle参数“filesystemio_options”
来支持Direct IO,不通os中的不同文件系统对Direct IO的支持也不同:


Windows 无需设置,直接使用Direct IO
AIX JFS文件系统需要通过设置“ filesystemio_options”为“SETALL” 或者“DIRECTIO”来支持 Direct IO
LINUX LINUX内核2.4.9以上才支持Direct IO。
NFS或者OCFS文件系统支持Direct IO。需要设置“filesystemio_options”为“SETALL” 或者“DIRECTIO”
Solaris 设置“forcedirectio“选项,并设置”filesystemio_options“为”SETALL“ 或者”DIRECTIO“。




参数”filesystemio_options“支持4种值:
ASYNCH: 使Oracle支持文件的异步(Asynchronous) IO
DIRECTIO 使Oracle支持文件的Direct IO
SETALL 同时支持以上两种
NONE 关闭支持Asynchronous IO和Direct IO的支持




在AIX的JFS2文件系统上,如果”filesystemio_options“为”SETALL“,则会支持Concurrent IO(并发IO)。
CIO比DIO的性能更高,因为JFS2的CIO支持多个进程同时对一个文件进行读写。






2.2、Asynchronous IO(异步IO) &&  Synchronous IO(同步IO)
Synchronous IO:
当请求发出之后,应用程序就会堵塞,直到请求满足为止。这种模式最大的好处就是调用应用程序在等待I/O请求完成时不需要使用CPU资源。
但是,对于一些强调高响应速度的程序(如DB)来说,希望这种等待时间越短越好,
这是就考虑使用Asynchronous IO模式:
进程发出IO请求后无需等待IO完成,可以去处理其他事情;IO 请求被放入一个队列中,一旦IO完成,系统会发出信号通知进程。




确认os已经设置支持AIO后,还需要设置Oracle初始化参数”DISK_ASYNCH_IO“为”true“以支持异步IO。






2.3、条带化(Striping)
条带化技术就是将数据分成很多小部分并把他们分别存储到不通磁盘上的不同 中去。
这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突。


2.4、RAID
RAID:独立磁盘冗余阵列(Redundant Arrary of Independent Disks)。


RAID-0:
只提供纯粹的条带化(Stripping),支持对数据的并发访问,只关注性能,不提供数据冗余和奇偶保护。


RAID-1:
提供磁盘镜像(Disk Mirror)。
两块磁盘的数据是同时写入的,写的性能下降了,但读的性能被提升了。


RAID0+1:
将RAID0和RAID1结合起来了。


RAID-3:
在RAID-3中,会有一块专门的磁盘驱动被用作存储错误修正或者奇偶校验数据,而其他的磁盘驱动则被条带化。
RAID-3的并行处理能力比较低,
它适合于主要是读操作的系统(如决策分析系统DSS,但是DSS会存在大量复杂查询,需要做JOIN,同样也会存在一些临时的写 操作),不适合存在大量写操作的系统(OLTP)。


RAID-5:
不做全磁盘镜像,但它会对每一个写操作做奇偶校验计算并写入奇偶校验数据。读的效率高, RAID-5需要为每个写操作做奇偶校验,因此它的写的效率很差。


RAID-S:
RAID-S是EMC公司的RAID-5 的实施方案,它和纯粹的RAID-5存在以下区别:
(1) 它条带化奇偶校验,但不条带化数据;
(2) 它与一个带有 缓存的异步硬件环境合并。
这个缓存主要是一种延迟写的机制,因此它能让系统在相对不忙的时候计算和写奇偶校验信息。


RAID-7:


引入了缓存机制,这个缓存是被一个内嵌式操作系统控制,但是RAID-7中数据是被条带化的,而奇偶校验不被条带化。
奇偶校验信息被存放着一个或者多个专门的磁盘上。




2.5、SAN
SAN(Storage Area Network,存储区域网)是一个高度的子网,这个子网中的设备可以从你的主网中卸载流量。
通常SAN由RAID这列连接光纤通道(Fire Channel)组成,
SAN和服务器和客户机的数据通信通过SCSI命令而非TCP/IP,数据处理是”块级“(block level)。
SAN通过特定的互连方式连接的若干台存储服务器组成一个单独的数据网络,提供企业级的数据存储服务。SAN是一种特殊的高度网络,连接网络服务器和诸如大磁盘阵列或者备份磁带库的存储设备,SAN置于LAN之下,而不涉及LAN。








来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29677883/viewspace-1170206/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29677883/viewspace-1170206/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值