我们来做两个例子:全表扫描导致这个结果:
TOTAL TIME
EVENT WAITS WAITED
------------------------------ ----- ------
db file scattered read 460 13
Run Code Online (Sandbox Code Playgroud)
这是通过非选择性索引范围扫描访问的结果:
TOTAL TIME
EVENT WAITS WAITED
------------------------------ ----- ------
db file scattered read 15 3
db file sequential read 6209 140
Run Code Online (Sandbox Code Playgroud)
我想从非选择性索引中获取许多rowid之后会出现分散的读取.只需一次读取即可读取经过碎片整理的I/O系统上的所有表.
你能解释一下如何阅读这些数据吗?
这两个等待事件的命名相当混乱.它们都表示I/O瓶颈:db file scattered read
通常来自多块读取,这意味着全表扫描,而db file sequential read
通常来自单块读取,表示索引读取.
大约有原因的各种不同的理论,为什么甲骨文的工程师给了这些事件,显然是误导性的名字.我衷心地建议你阅读Eric Emrick关于这个主题的文章,为什么有关于Oracle读书的分散思想?
至于解释数据,索引读取至少是两个逻辑读取:索引的查找,然后查找表所指示的表行.迁移的行等内容可能会增加读取次数.因此,通过索引读取大量行是一项昂贵的操作.然而,全表扫描可以使用多块读取来捕获行:即为单个逻辑读取拉入许多行.这就是为什么全表扫描通常更有效地检索表的总行数甚至相对较小的百分比.