Oracle 等待事件:您如何解释 db 文件分散/顺序读取?

Posted

技术标签:

【中文标题】Oracle 等待事件:您如何解释 db 文件分散/顺序读取?【英文标题】:Oracle wait events: what do you interpret db file scattered/sequential read? 【发布时间】:2011-07-31 14:36:14 【问题描述】:

让我们举两个例子: 全表扫描会导致以下结果:

                               TOTAL   TIME
EVENT                          WAITS WAITED
------------------------------ ----- ------
db file scattered read           460     13

这是通过非选择性索引范围扫描访问的结果:

                               TOTAL   TIME
EVENT                          WAITS WAITED
------------------------------ ----- ------
db file scattered read            15      3
db file sequential read         6209    140

我希望在从非选择性索引中获取许多 rowid 后会出现分散读取。只需一次顺序读取即可读取碎片整理 I/O 系统上的所有表。

你能解释一下如何读取这些数据吗?

【问题讨论】:

【参考方案1】:

这两个等待事件的命名相当混乱。两者都表示 I/O 瓶颈:db file scattered read 通常源自多块读取,即全表扫描,而db file sequential read 通常源自单块读取,即索引读取。

对于为什么甲骨文工程师给这些事件起明显误导性名称的原因有各种不同的理论。我衷心推荐你阅读 Eric Emrick 关于这个主题的文章,Why Have Scattered Thoughts About Oracle Reads?


至于对数据的解释,一次索引读取至少是两次逻辑读取:一次查找索引,然后查找表所指示的表行。诸如迁移行之类的事情可能会增加读取次数。因此通过索引读取大量行是一项昂贵的操作。然而,全表扫描可以只使用多块读取来收集行:即为单个逻辑读取拉入许多行。这就是为什么全表扫描通常更有效地检索即使是相对较小百分比的表总行数。

【讨论】:

以上是关于Oracle 等待事件:您如何解释 db 文件分散/顺序读取?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 等待事件之 db file sequential read

Oracle 等待事件之 db file parallel read

Oracle db file parallel write 和 log file parallel write 等待事件

Oracle等待事件之db file scattered read

oracle启用异步IO(db file async I/O submit)

Oracle 等待事件之 free buffer waits