ORACLE数据库技术实用详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

6.4 数据块的结构

数据块作为Oracle发出I/O的最小单位,其结构由三部分组成:数据块头部、数据以及可用空间,如图6-12所示。

数据块头部记录了当前该数据块所属的segment的类型(数据或者索引)、数据块的地址等信息。其中最重要的信息是ITL(Interested Transaction List)槽。每当一个事务要更新数据块里的数据的时候,必须先在数据块的头部获取一个可用的ITL槽,然后将当前的事务ID、事务所使用的undo数据块的地址、SCN号以及当前事务是否提交的标记等信息注册到ITL槽里。ITL槽可以重复使用,但是只有当ITL槽上的事务提交或者回滚以后,该ITL槽才能被其他事务覆盖。如果一个事务要获得可用的ITL槽时,发现数据块头部所有的ITL槽都正在被其他事务使用,则会动态地创建一个新的ITL槽。

图6-12 数据块结构

可以在segment上定义ITL槽的初始数量和最大数量,由参数initrans和maxtrans指定。initrans指定了默认一个数据块里有几个ITL槽,而maxtrans则指定了最多可以动态生成多少个ITL槽。默认情况下,表的initrans为1,索引的initrans为2。我们可以修改这两个属性。其命令如下所示,该命令表示将employees表里的数据块头部的ITL槽的个数增加到20个。

    SQL> alter table employees initrans 20;

数据块头部还具有行目录(row directory),Oracle正是通过读取行目录里的条目才能找到所需要的数据行。因为在这里记录了该数据块里每一行相对于起点的位移数量。所以Oracle在查找某一条记录时,只要在行目录里找到该记录相对于起点的位移,然后直接移到该记录即可。

数据行则是从数据块的底部开始插入的,其使用空间从下往上增长。而数据块头部则从数据块的顶部开始插入,其使用空间从上往下增长。于是中间部分则是可用空间。这种空间使用方式使得数据块的空间利用最为充分。