对于解释数据,索引读至少是两个逻辑读:查找索引,然后查找表所指示的表行。诸如迁移行之类的事情可能会增加读取次数。因此,通过索引读取大量行是一项昂贵的操作。然而,全表扫描只能使用多块读取来吸收行:即为单个逻辑读取拉入许多行。这就是为什么对于检索表总行中相对较小的百分比来说,全表扫描通常更有效的原因。
让我们做两个例子:全表扫描将导致以下结果:
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有分散的想法?
对于解释数据,索引读至少是两个逻辑读:查找索引,然后查找表所指示的表行。诸如迁移行之类的事情可能会增加读取次数。因此,通过索引读取大量行是一项昂贵的操作。然而,全表扫描只能使用多块读取来吸收行:即为单个逻辑读取拉入许多行。这就是为什么对于检索表总行中相对较小的百分比来说,全表扫描通常更有效的原因。