重庆思庄Oracle、Redhat认证学习论坛

标题: 等待事件:db file scattered read(离散读) [打印本页]

作者: jiawang    时间: 2023-2-8 16:24
标题: 等待事件: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条件中加入更多的索引字段







欢迎光临 重庆思庄Oracle、Redhat认证学习论坛 (http://bbs.cqsztech.com/) Powered by Discuz! X3.2