4.6.2 段
表空间将数据按照类型从逻辑上分离开来,如将用户数据与系统数据分别组织在一个表空间中。在同一个表空间中,可能存在不同类型的数据库对象,如表、索引。Oracle将不同数据库对象中的数据以段的形式组织在一起。一个表空间包含多个段,但一个段只能属于一个表空间。
当用户在数据库中创建一个数据库对象时,在表空间中将自动创建一个段,以存储该对象的数据。比如,在默认情况下,一个表对应一个表段,一个索引对应一个索引段。段中存储空间的分配是以区为单位进行的。在一个段中包含若干个区。在分配段时需要指定初始的区个数。随着段中数据的增加,数据服务器将会扩充该段,为段分配所需的区,而当段中数据被删除时,空闲的区可以被回收。
在表空间中主要可以创建四种主要类型的段,它们是数据段、索引段、临时段和回滚段。在每个段中存储不同的数据库对象。
数据段用来保存表中的数据,默认情况下一个表对应一个表段。在一个表段中只能存储一个表中的数据。当用户在表空间中创建一个表时,数据库服务器将自动在这个表空间中为该表创建一个段,段的名字与表的名字相同。
索引段用来存储索引中的数据,当用户为一个表创建索引时,数据服务器将自动为该索引创建一个索引段,索引段与索引的名字相同,并且它们间是一一对应的。当在表上创建主键约束或唯一性约束时,也将产生相应的索引段。
临时段用于存放临时数据,当用户执行排序等操作时,将产生大量的临时数据,这些临时数据存储在临时段中。当然,临时数据是优先存储在PGA的排序区中的,这样可以提高排序的速度。如果排序区的大小不足以存放这些临时数据,才会用到临时段。临时段不是必需的,如果没有创建专门的临时段,用户的排序操作将使用SYSTEM表空间中的临时段。由于SYSTEM表空间存储着重要得系统数据,频繁地使用SYSTEM表空间将产生大量的碎片,从而降低数据库的性能,所以Oracle建议尽量创建专门的临时段,并将它存放在专门的临时表空间中。
回滚段用于存储回滚数据。当用户执行DML语句时,数据库服务器将修改后的数据存储在表段中,而将修改前的数据作为回滚数据存储在回滚段中。当用户回滚事务时,数据库服务器将回滚段中的数据重新写入表段,该事务所做的修改将取消。当用户提交事务时,回滚段中的数据将变为无效,这时用户将无法回滚该事务。在数据库中可以创建多个回滚段。当用户执行DML操作时,数据库服务器将自动为当前事务指定一个回滚段,用户也可以通过命令指定一个回滚段。在创建数据库时,系统在SYSTEM表空间中自动创建一个SYSTEM回滚段,SYSTEM回滚段用于维护Oracle内部的事务。数据库管理员可以通过命令创建其他的回滚段。
需要注意的是,Oracle 11g提供了两种管理回滚数据的方法,一种是手工管理方式,这种方法利用回滚段维护事务。另一种方法称为自动管理方式,这种方式利用专门的UNDO表空间管理回滚数据。由于回滚段的管理太复杂,Oracle建议大家使用自动管理方式,在以后的Oracle版本中,可能会取消手工管理方式。