第6章 表空间的管理

表空间是数据库的逻辑组织形式,在一个数据库中可以创建多个表空间。表空间的主要作用是将不同用途的数据分离开来,以提高数据的安全性,并提高系统的性能。

表空间在数据库中起着非常重要的作用。一方面,表空间在逻辑结构上由多个段组成,数据都存储在表空间的段中;另一方面,表空间在物理结构上对应着多个数据文件,数据库对象中的数据最终存储在这些数据文件中。

表空间的类型较多,根据不同的分类标准,将得到不同的分类结果。根据存储数据类型的不同,表空间可分为系统表空间、UNDO表空间、临时表空间和用户表空间。根据存储空间方式的不同,表空间可分为字典管理表空间和本地管理表空间。根据是否支持大文件来划分,表空间可分为大文件表空间和小文件表空间。

表空间的管理主要涉及各种类型表空间的创建、删除、扩展、修改状态等。

6.1 表空间的结构

一个表空间由多个段组成,每个段可能代表一个数据库对象。当用户创建表、索引、簇等数据库对象时,在表空间中将自动创建一个段,以存储该对象的数据。一个段占用一个或多个区,当区的空间被写满后,段就会自动扩展。在创建表空间时就需要指定区的分配方式。

6.1.1 区管理方式

区管理方式指的是为一个数据库对象分配存储空间的方式,在创建表空间时需要指定区管理方式。Oracle支持两种区管理方式,字典管理和本地管理。

在创建字典管理的表空间时,需要指定若干存储参数,以后在这个表空间中创建数据库对象时,就按照这些存储参数为数据库对象分配所需要的区,当这些区被写满后,数据库服务器将按照存储参数为数据库对象分配新的区。表空间的存储参数记录在数据字典中。

在创建字典管理的表空间时,可以指定以下几个存储参数:

·INITIAL:指定第一个区的大小,即首先要为数据库对象分配的区的大小。

·NEXT:指定下一个区的大小。

·MINEXTENTS:为数据库对象分配的最少区的个数,默认值为1。

·MAXEXTENTS:最多为数据库对象分配的区个数。

·PCTINCREASE:从第三个区开始,每一个区在前一个区的基础上增长的百分比。

在字典管理表空间中,区的分配和回收都是基于数据字典进行的。当为数据库对象分配区时,需要从数据字典中查询存储参数,分配结束后,需要把分配的结果写入数据字典。这样要在数据字典上执行很多的查询操作和DML操作,并且产生重做日志和回滚数据。另外,由于数据库对象中的区大小不同,随着数据库服务器的运行,在段中将产生越来越的存储碎片。

在本地管理表空间中,区的大小都是相同的。在创建表空间时,可以通过参数指定统一的区大小,或者由数据库服务器根据实际情况自动指定区的大小。

与字典管理方式相比,本地管理方式有以下优点:

·区的分配和回收不再基于数据字典,从而避免了对数据字典的递归访问,也不会产生重做日志和回滚数据。

·所有区的大小都相同,这就减少了存储空间中的存储碎片。

·不需要合并表空间中的存储碎片,数据库服务器自动监视存储空间的使用情况,并合并相邻的空闲存储空间。

Oracle建议大家使用本地管理表空间。在Oracle 11g的数据库中创建的表空间默认就是本地管理的,如SYSTEM表空间目前是字典管理的,可以通过下面的方式,调用PL/SQL程序包中的存储过程,把它转化为本地管理表空间:


SQL>EXECUTE DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL('SYSTEM');