当前位置:   article > 正文

等待事件:db file scattered read(离散读)

db file scattered read
  • db file scattered read等待事件:

         由于多数据块读操作产生的,当我们检索数据时从磁盘上读数据到内存中,一次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语句或索引

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/477692
推荐阅读
相关标签
  

闽ICP备14008679号