赞
踩
由于多数据块读操作产生的,当我们检索数据时从磁盘上读数据到内存中,一次I/O读取多个数据块,而数据块在内存中是分散分布并不是连续的,将存储中连续的数据块离散的读入到内存中不连续的位置,数据块被读取到内存的这个过程中会产生"db file scattered read"事件。
1.FTS(full table scan)全表扫描或IFFS (index fast full scan) 快速索引全扫描
在使用以上两种扫描时,为了保证性能会一次性读取多个块,称为multi block I/O。每次执行multi block I/O,都会等待物理I/O结束,此时出现等待事件:db file scattered read。
参数db_file_multiblock_read_count是每次multi block I/O的数量的限制值。
oracle在执行FTS时也执行single block I/O,这时即使FTS也会发生db file sequential read等待,比如:一个区有9个块,一次multi block I/O读取了8个块,则一次以multi block I/O读取之后的剩余一个块通过single block I/O读取。如果剩下的块有两个,就会执行multi block I/O,而且只读取两个块。这种情况经常发生时,引发多次的I/O,可能成为FTS速度下降的原因。
2.index range scan索引范围扫描
由于每次进行索引范围扫描操作时,都需要对索引叶块进行预取(prefetching)操作,而在删除和修改操作时候,oracle要对预取指数进行维护,因此出现了db file sequential read和db file scattered read等待事件。
oracle有个隐含参数“_db_file_noncontig_mblock_read_count”定义了索引每次预期的数据块数,默认是11。
1.对相应的sql语句进行修改
2.重建索引
3.在WHERE条件中加入更多的索引字段
可以看出物理读和逻辑读较多,db file scattered read等待事件较多,Avg wait time平均单次等待时间应当小于20ms
可以看出造成物理读和逻辑多的对象都来自于SECRC_QT_POSI这张表,查看该表执行计划,修改相应的sql语句或索引
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。