7.1.2 段的空间管理
一般来说,段不需要用户专门创建,当用户创建一个数据库对象时,在数据库中将自动产生对应的段。临时段和回滚段比较特殊,临时段位于临时表空间中,它是随着用户的排序等操作的进行而动态创建和消失的。回滚段位于UNDO表空间中,并且随着用户事务的执行而动态产生和消失。
在本地管理表空间中,区的分配策略有自动方式和手工方式两种。如果采用自动方式(AUTOALLOCATE),数据库服务器将决定区的大小,并自动进行区的分配和回收,区的大小是可变的,默认的区大小为64KB。如果采用手工方式,则需要通过UNIFORM指定区的大小,默认为1MB。
在创建本地管理表空间时,还可以使用SEGMENT SPACE MANAGEMENT子句指定段空间的管理方式。如果采用手工方式,则表空间将为每个段维护一个空闲列表(Free List),它位于数据文件的头部,在空闲列表中记录当前数据文件中所有的空闲块,段利用空闲列表管理块的分配和回收。如果选择自动方式,段将采用位图的方式管理块的分配和回收。
为了对段中数据块的使用进行控制,在段中设置了一个HWM(High Water Mark)。HWM可以认为是一个指针,在段刚被创建时,HWM位于段的开始位置。在HWM之上是没有被格式化,尚不能写入数据的数据块,而在HWM之下的数据块有以下几种情况:
·已经包含数据。
·以前曾经包含数据,但后来数据被删除。
·已经被格式化,且状态为空闲的。
·尚未被格式化。
为了给用户数据分配数据块,在段中还设置了一个低HWM,位于低HWM之下的数据块要么是已经包含数据的,要么是曾经包含数据,但后来数据被删除的。对一个用户事务而言,可用的数据块就是那些位于低HWM和HWM之间的数据块。当用户向段中写入数据时,服务器进程将在低HWM和HWM之间查找那些已经被格式化的数据块,将数据写入这些数据块。如果没有足够的数据块可用,服务器进程将在这个范围内查找那些尚未被格式化的数据块,对其进行格式化,然后将数据写入。如果这样的数据块还不能满足要求,服务器进程将把HWM向上移动,为这次事务分配其他尚未格式化的数据块,然后对其进行格式化,并将数据写入。在将数据写入数据块之后,服务器进程将把低HWM向上移动,使其指向第一个可用的数据块。数据块的分配情况如图7.3所示。
图 7.3 数据块的分配