Oracle等待事件:如何解释数据库文件的分散/顺序读取



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

                               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

我希望在从非选择性索引中取出许多行后,可以看到分散的读取。只需一次顺序读取就可以读取碎片整理I/O系统上的所有表。

你能告诉我怎么读这些数据吗?

这两个等待事件的命名相当令人困惑。它们都表示I/O瓶颈:db file scattered read通常来自多块读取,这意味着全表扫描,而db file sequential read通常来自单块读取,这意味着索引读取。

关于为什么 Oracle工程师给这些事件起了如此明显的误导性的名字,有各种不同的理论。我衷心推荐您阅读Eric Emrick关于这个主题的文章,为什么对Oracle read有分散的想法?


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

最新更新