Oracle数据块检索某张表的数据有多种方法,不过总结起来不外乎两种,一种是通过全表扫描,检索出这张表的所有数据块,然后从中找出所需要的数据;另外一种是通过索引,首先找到符合检索条件的索引记录,找出对应表记录的rowid,然后通过rowid查找相关的数据记录。通过索引扫描数据是检索表数据的一个特例,通过rowid中的file id和block id可以直接定位一个数据块,找到数据块后,根据rowid中的行号可以找到对应的数据块中的偏移量,然后找出这条记录。实际上根据索引查找数据的算法也包含在全表扫描中。今天我们以全表扫描为例来看看Oracle是如何检索表数据的。第一步,通过数据字典tab$,我们可以找到表的定义,包括字段定义以及数据段的定义。段的信息存放于seg$中,不过在tab$中已经包含了从数据文件中找到该数据段的所有信息了。
tab$中的file#,block#就指出了该表的第一个extent的头部位置,通过这个数据我们就可以找到这张表的表头,根据表头的bitmap信息,就可以找到包含这张表的数据的数据块的extent信息,也就可以去扫描这张表了。要扫描这张表,就需要不这张表的数据块先读入DB CACHE,然后再从DB CACHE中访问这些数据。因为exent是连续的数据块,因此读取这些extent的时候,采用的是多块读操作,当读操作正在进行的时候,会产生db file scattered read等待事件。如果某个exten