二.数据块(Block)结构

         数据块(Block)是Oracle最小的逻辑结构,主要包括三个部分:

         1.块头(Header)

           在数据块(Block)中普通块头和可变块头,表字典,行字典所使用的空间总称为块头块头是可变的,多数在84-107字节之间。假如在块中插入了更多行(行字典会增加),或者指定了较大的INITRANS值(块头会增加)时,块头的体积会增加。

           普通块头和可变块头:块头部分包含了块的类型和块的地址信息。块的类型可以是数据块,索引块,回退块。普通的块头占24字节,可变的块头占24*INITRANS字节。默认情况下,对表来说,INITRANS的值是1;而对索引来说,INITRANS的值是2。块头的数据按从上到下储存

           表字典(Table Directory):块的这部分包含了在此块中有数据的表的信息,表字典占4个字节。

           行字典(Row Directory):块的这部分包含了在此块中实际的行地址信息。即使删除了块中所有行,为行字典分配的空间是不会少的。当新的行被加到块中时,这部分空间可以被重用。行字典所占字节为4*行数。

           事务口(SLOT):当事务对块内的行做了修改时使用事务口。

         2.数据空间(Row Data)

           实际的数据按照一定的格式储存在这部分空间,数据按从下往上储存。

         3.自由空间(Free Space)

           块的自由空间是在块的中间,并且假如块头和数据空间的数据增加或者扩大了,允许块头和数据空间部分占用自由空间进行扩展。在块中的自由空间开始时是连续的,然后由于删除及更新操作在块的自由空间中会产生碎片。在需要时,Oracle服务器可以将块中的自由空间合并。下图为数据块的结构:

 

spacer.gif


 

        4.ROWID的格式

          ROWID是一个伪列,是用来确保表中行的唯一性,他并不能指示出行的物理位置,但可以用来定位行。当行确定以后ROWID是存储在索引中的一组既定的值,我们可以像表中普通的列一样将他查询出来。利用ROWID是访问表中一行的最快方式。ROWID需要10个字节来存储,显示为18位的字符串。ROWID的组成结构为:

          Data object number(6位字符串) + relative file number(3位字符串) + block number(6位字符串) + row number(3位字符串)  如:AAAH25AABAAAPCGAAB

          一般来说,当标中的行确定以后,ROWID就不会发生变化。但是当如下情况发生时,ROWID将发生变化:对一个表作表空间的移动后。对一个表进行了EXP/IMP后。下图为ROWID的格式:spacer.gif


          Oracle8i 和oracle 9i使用扩展的数据类型ROWID来储存数据库中每一行的地址。ROWID有效的定义了行,不论是分区表,分区索引还是非分区表和非分区索引。ROWID支持表空间中数据块地址,扩展的ROWID使用64位(A-z,0-9,+,/)来编码每个行的物理地址。

Oracle

SQL> select rowid,x from test where x=2;

ROWID                       X

------------------ ----------

AAAH25AABAAAPCGAAB          2

        4.数据块(Block)的存储参数

 

          当建立表或者索引等对象时,用户可以指定块的储存参数,块的空间利用率参数用于控制数据段和索引段中空间的利用率。合理的设置这些参数的值可以节省许多储存空间,并且提供较好的性能。块的并发性控制参数控制了使用块数据的并发事务数。块的储存参数分两类:控制并发性的参数,控制空间使用的利用率参数。

          控制并发性的参数:INITRANS和MAXTRANS参数控制了使用数据块的并发事务数。这些参数可以在建立对象时指定。根据这两个参数,在块中为事务实体(ENTITY)保留一定的空间。这两个参数指定了在一个索引块或者数据块内建立的事务口(SLOT)的初始值和最大值。事务口用于储存在某一时间点对块所做修改的事务信息。即使一个事务修改了多行或者有多个索引实体,一个事务只使用一个事务口。

          INITRANS——该参数保证最小的并发性。对数据段来说,该参数的默认值是1;对于索引段来说,该参数的默认值为2。如果将INITRANS的值设置为3,保证至少3个事务可以并发的对块做修改。假如需要,在快的自由空间中可以分配更多的事务口,以便更度的并发事务可以修改块中的行。

          MAXTRANS——该参数的默认值是255。设置了对数据块或者索引块可以做修改的并发事务的限制值。当设置该参数的值时限制了事务口的空间使用率,并且包这个了在块中有足够的空间可以为行数据或者索引数据使用。

          置事务条目就是为块中的事务保留空间。这两个参数的设置是基于在一个给定时间点一个块中可以接触到的最大事务数来决定的。INITRANS指定在块头中为DML事务条目保留的空间。假如没有指定INITRANS,则Oracle默认为表数据块指定为1,为索引块及聚簇块指定为2。

          当多个事务访问数据块时,在块头中为每一个事务分配一个块空间。当没有预分配的空间可用时,Oracle从块的自由空间中为事务分配空间。从自由空间中分配的空间成为块头的一部分,从不释放出来。MAXTRANS参数限制了可以并发使用一个数据块中数据的事务数。使用MAXTRANS限制在一个块中可以为事务分配的自由空间的数量。该参数的默认值与操作系统有关,最大值是255。

          INITRANS和MAXTRANS的值应该根据在一个块中同时更新,插入,删除行的事务数来决定,假如行长度较大,或者访问表的用户数很少时,设置较小的INITRANS值。假如一张表经常被多个用户访问,则多个用户同时访问一个块进行更新,插入,删除操作的概率较高。如果在块头中没有保留足够的事务空间,Oracle会在块的自由空间中动态分配事务空间(这种操作很昂贵,并且以这种方式分配的空间不能被回收)。当设置了MAXTRANS时,Oracle限制了一个块中事务的数量。

          当建立表,索引或聚簇时,可以指定INITRANS和MAXTRANS。如果经常查询表和索引,则该表和索引的INITRANS值应该设置一个比较高的值。

          控制数据块空间利用率的参数:PCTUSED和PCTFREE是空间利用率参数。这两个参数控制了块中插入或更新行时的可用空间。这些参数可以在建立对象时指定。并且这两个参数只能为段指定,不能为表空间指定

          PCTFREE——该参数指定了由于块中数据的更新而导致数据增长时需要在块中保留的自由空间的百分比。该参数的默认值是10%。假如该表正在做大量的更新,并且更新后行的长度会增长,则应该讲PCTFREE参数的值设置的大点。这样在块中会保留较大的自由空间。

          PCTUSED——该参数决定了什么时候块中可以加入新行。该参数的默认值是40%。按PCTUSED参数的设置,当块满的时候,Oracle只有在块中已经使用的空间低于PCTUSED设置的百分比时,才可以将新行加入到此块中。当一个块中已经使用的空间低于PCTUSED临界值时,此块被加入到自由队列中。一个段的自由队列是由一组用于将来插入时可以分配的块组成。默认情况下,一个段只建立一个自由队列。通过设置储存参数中的FREELIST的值,可以建立自由队列数较多的段。

          PCTUSED保证只有在块中有能储存一条平均长度的记录的足够空间时,才将此块防到自由队列中。假如在自由队列中的块没有足够的空间插入一条记录时,Oracle服务器将查找自由队列中的下一块,知道找到有足够空间的块或者找到自由队列末尾为止。合理的设置PCTUSED值可以减少搜索自由队列的时间。下图为数据块(Block)中PCTUSED和PCTFREE示例:


spacer.gif