Oracle event之db file read怎么用

64次阅读
没有评论

共计 2294 个字符,预计需要花费 6 分钟才能阅读完成。

这篇文章主要介绍 Oracle  event 之 db file read 怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

db file sequential read (single block read into one SGA buffer)

db file scattered read (multiblock read into many discontinuous SGA buffers)

direct read (single or multiblock read into the PGA, bypassing the SGA)

最为常见的是执行计划中包含了 INDEX FULL SCAN/UNIQUE SCAN, 此时出现”db file sequential read”等待是预料之中的,一般不需要我们去特别关注

  2. 当执行计划包含了 INDEX RANGE SCAN-(“TABLE ACCESS BY INDEX ROWID”/”DELETE”/”UPDATE”),服务进程将按照”访问索引 - 找到 rowid- 访问 rowid 指定的表数据块并执行必要的操作”顺序访问 index 和 table,每次物理 读取都会进入”db file sequential read”等待,且每次读取的都是一个数据块;这种情况下 clustering_factor 将发挥其作用,需要我们特别去关注,本例中提及的解决方法对 这种情景也有效

 3.Extent boundary, 假设一个 Extent 区间中有 33 个数据块,而一次”db file scattered read”多块读所读取的块数为 8,那么在读取这个区间时经过 4 次多块读取后,还剩下一个数据块,但是请记住多块读 scattered read 是不能跨越一个区间的(span an extent),此时就会单块读取并出现”db file sequential read”。这是一种正常现象,一般不需要额外关注

 4. 假设某个区间内有 8 个数据块,它们可以是块 a,b,c,d,e,f,g,h,恰好当前系统中除了 d 块外的其他数据块都已经被缓存在 buffer cache 中了,而这时候恰好要访问这个区间中的数据,那么此时就会单块读取 d 这个数据块,并出现”db file sequential read”等待。注意这种情况不仅于表,也可能发生在索引上。这是一种正常现象,一般不需要额外关注

5.chained/migrated rows 即链式或迁移行,这里我们不介绍链式行的形成原因,chained/migrated rows 会造成服务进程在 fetch 一行记录时需要额外地单块读取,从而出现”db file sequential read”。这种现象需要我们特别去关注,因为大量的链式 / 迁移行将导致如 FULL SCAN 等操作极度恶化(以往的经验是一张本来全表扫描只需要 30 分钟的表,在出现大量链式行后,全表扫描需要数个小时),同时也会对其他操作造成不那么 明显的性能影响。可以通过监控 v$sysstat 视图中的”table fetch continued row”操作统计来了解系统中链式 / 迁移行访问的情况,还可以通过 DBA_TBALES 视图中的 CHAIN_CNT 来了解表上的链式 / 迁移行情况,当然这 要求定期收集表上的统计信息;如果没有定期收集的习惯,那么可以配合 @?/rdbms/admin/utlchain 脚本和 analyze table list chained rows 命令来获取必要的链式行信息

6. 创建 Index entry,显然当对表上执行 INSERT 操作插入数据时,虽然在执行计划中你看不到过多的细节,但实际上我们需要利用索引来快速验证表上的某些约束是否 合理,还需要在索引的叶子块中插入相关的记录,此时也可能出现”db file sequential read”等待事件,当然这还和具体的插入的方式有关系。这是一种正常现象,一般不需要额外关注

7. 针对表上的 UPDATE/DELETE,不同于之前提到的”INDEX RANGE SCAN-UPDATE/DELETE”,如果我们使用 rowid 去更新或删除数据时,服务进程会先访问 rowid 指向的表块 (注意是先访问 table block) 上的行数据,之后会根据该行上的具体数据去访问索引叶子块(注意 Oracle 并不知道这些 leaf block 在哪里,所以这里同样要如 range-scan/unique-scan 那样去访问 index branch block),这些访问都将会是单块读取,并会出现’db file sequential read’,完成必要的读取后才会执行更新或删除的实际 EXEC 操作

db file sequential read  当进程需要的信息不在 SGA,要等待从磁盘读入 SGA 中,此时进程等待此事件。一般是由 sql 或者递归 sql 中发出,从索引,回滚段,表(rowid 回表),控制文件,数据文件头处读取信息触发. 要减少这个等待事件,要么减少它的次数,要么减少平均等待时间。通过调优 SQL 来减少逻辑读,留意效率低的大范围索引扫描回表(可能全表扫更好),可以减低次数。用更高响应时间的存储,分散热点文件,可以减轻平均等待时间。在新的存储子系统,平均单块读等待时间不应超过 10ms(千分之一秒)。通过 p1 与 p2 参数与 dba_extents 视图,我们定位到等待访问的段,然后来分散热点。

官档等待事件:performance tuning guide  — wait events statistics

以上是“Oracle  event 之 db file read 怎么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-19发表,共计2294字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)