跟其他段一样,它由若干个区(
extent
)组成(在本例中,是两个区)
,每个区由若干个块组成(在本例中,是
16
个块)
。第一
个区的第一个块为段头块(
segment header
)
。其中一些块(第
4
、
9
、
10
、
19
和
21
块)被缓存在高速缓存中。一个数据库进程对这个
段执行一次串行的全扫描(并行全扫描有其特殊的行为,将在后面介绍)
,并不能通过一次单独的物理读就完成。即使初始化参数
db_file_multiblock_read_count
的值被设置为
32
或者更大也不能。
如果初始化参数
db_file_multiblock_read_count
被设置为
8
,将会造成如下的物理读过程。
⊙
一个单块(
single-block
)读获取段头(块
1
)
。
⊙
一个多块(
multiblock
)读得到两个块(块
2
和
3
)
。不能一次读更多的块因为块
4
被缓存。
⊙
一个多块读读取
4
个块(从块
5
到块
8
)
。不能读更多的块因为块
9
被缓存。
⊙
一个多块读读取
6
个块(从块
11
到块
16
)
。不能读更多的块因为块
16
是一个区的最后一个块,不能跨区读。
⊙
一个多块读读取
2
个块(块
17
和块
18
)
。不能读更多的块因为块
19
被缓存。
⊙
一个单块读块取块
20
。不能读更多的块因为块
21
被缓存。
⊙
一个多块读读取
8
个块(从块
22
到块
29
)
。不能读更多的块因为初始化参数
db_file_multiblock_read_count
被设置为
8
。
⊙
一个多块读读取
3
个块(从块
30
到块
32
)
。
总之,这个进程共进行了两个单块读和六个多块读。平均每个多块读的块数约为
4
。平均每次读块的数目小于参数设置值
8
的事
实,解释了
Oracle
在计算系统统计信息时引入变量
mbrc
的原因。
在此,
了解查询优化器如何计算多块读的开销也是很重要的
(比如,
在全表扫描或快速全索引扫描时)
。
就像
Wolfgang Breitling
在他的文章“
A Look Under the Hood of CBO: The 10053 Event
”中指出的那样,当系统统计信息不可用时,这个开销可用下列公式
来近似地计算。