第7章 存储空间管理

在数据库的逻辑结构中,表空间将不同类型的数据分别组织在一起,如系统数据、用户数据、临时数据、回滚数据等。在同一个表空间中,数据以数据库对象为单位组织在一起,一般情况下一个数据库对象对应一个段,一个表空间中包含多个段。

在段中存储数据库对象中的数据,数据所占用的存储空间以区为单位进行分配和回收。一个数据库对象占用若干个区,所以段是由若干个区组成的。当为数据库对象分配存储空间时,一次分配一个或多个区。区是分配和回收存储空间的基本单位,一个区是由若干个连续的数据块组成的。

数据块是逻辑结构中的最小存储单位,是Oracle读写数据的基本单位。当用户访问数据时,服务器进程首先将数据从数据块读到数据库高速缓存中,并存储在与数据块大小相同的缓冲区中,然后在缓冲区中对数据进行读写。

数据库中的数据在物理上是存储在磁盘上的,需要占用一定的操作系统块。一个数据块是由若干个操作系统块组成的,因此,数据块的大小是操作系统块的整数倍。数据库服务器对数据块的读写最终将转化为对多个操作系统块的读写。

7.1 段的管理

在表空间中,一个段一般代表一个数据库对象,对象的所有数据都存储在对应的段中。一般情况下段不需要用户自己创建,在创建数据库对象将自动产生段。为段所分配的空间就位于表空间的数据文件中,这些存储空间由若干个区组成。段、区和数据块之间的关系如图7.1所示。

figure_0236_0076

图 7.1 段、区和数据块之间的关系

7.1.1 段的类型

Oracle 11g支持10余种类型的段。通过查询数据字典dba_segments,可以得到当前数据库中已经存在的段类型。例如:


SQL>SELECT DISTINCT segment_type FROM dba_segments;

SEGMENT_TYPE

TABLE

INDEX

ROLLBACK

CLUSTER

LOBSEGMENT

LOBINDEX

TABLE PARTITION

INDEX PARTITION

……


1.表段(TABLE)

表段是用来存储表中的数据的,这是最常见的一种段。在创建表时将自动创建一个同名的段,表中的数据就存储在数据段中。

2.索引段(INDEX)

索引是依赖于表的数据库对象,它的功能是加快表的查询速度。当用户执行CREATE INDEX命令创建索引时,在数据库中将产生一个索引段。当用户在表上定义主键约束和唯一性约束时也将自动产生索引段。索引段的名称与索引相同,索引中的数据就存储在索引段中。

3.临时段

当用户执行排序等操作时,将产生大量的临时数据。临时数据将首先存储在PGA的排序区中,如果排序区的大小不足以存放这些临时数据时,将使用临时段。一般情况下,用户在执行以下操作时可能用到临时段:


SELECT……FROM……ORDER BY……

SELECT……FROM……GROUP BY……

SELECT DISTINCT……FROM……

SELECT……UNION

CREATE INDEX……

ANALYZE


临时段一般位于专门的临时表空间中。如果没有专门的临时表空间,数据库服务器将把SYSTEM表空间作为用户的临时表空间。临时段不是一种永久性的段,而是随着用户的排序操作的进行而动态产生和消失的。当排序操作开始时,在临时表空间中将产生一个临时段,在排序结束时临时段将被删除。如果在SYSTEM表空间中存储这些临时数据,将导致大量的存储碎片的产生,从而大大降低数据库服务器的性能。因此,Oracle建议创建专门的临时表空间。

4.回滚段(ROLLBACK)

回滚段是用来存储回滚数据的。如果使用自动方式管理回滚数据,需要在数据库中创建一个UNDO表空间,随着用户事务的执行,在UNDO表空间中将自动产生回滚段。

5.分区表段(TABLE PARTITION)

在数据库中可以将一个大表分成几个分区(PARTITION),每个分区对应一个段。这些分区表段可以存储在同一个表空间中,也可以存储在不同的表空间中。

分区表主要应用于数据仓库,它的主要作用是缩小数据库查询的范围,加快查询的速度。例如,某公司的客户表中存储了上万条客户信息,假设将这个表分成13个区,将客户信息按照其姓名的首字母不同而分别存储在不同的分区中。姓名以“A”和“B”开始的客户存储在第一个分区中,以“C”和“D”开始的存储在第二个区中,依此类推。这样一个表中的数据就被分开存储在13个分区中,如果要查询一个客户的信息,只需要在它所在的分区中查询即可,查询的范围将大约缩小为原来的1/13。

6.分区索引段(INDEX PARTITION)

与表的分区类似,索引也可以分区。将一个索引划分为几个分区,每个分区对应一个段,索引的数据将分别存储在这些段中。对索引进行分区的目的是为了加快查询索引的速度。需要注意的是,只有对表进行分区后,才能在表上创建分区索引。

7.LOB段

如果在表中定义了CLOB或BLOB类型的列,在表中就可以存储大文本或二进制数据,如文档、图像、声音等。LOB数据并不是直接存储在表段中,而是单独存放在一个LOB段中,在表中仅仅存放LOB段的指针。

8.LOB索引段

如果在表上定义了LOB类型的列,在数据库中将自动创建LOB段,同时自动创建LOB索引段。LOB索引段的作用是加快LOB列的查询速度。

9.簇段(CLUSTER)

簇是一种数据库对象,它的作用是将逻辑上相关的数据组织在一起,簇中的数据来自一个或多个表。每个簇对应一个簇段,在创建簇时将自动创建簇段,并且簇段的名称与簇完全相同。使用簇可以加快多表查询的速度。

10.索引组织表(INDEX ORGANIZED TABLE)段

如果经常要根据一个表的主键查询数据,可以将主键列上的索引与表放在一个段中,这种表称为索引组织表,它被存储在一个表段中,这种表段就是索引组织表段。索引组织表段的主要作用是加快基于主键的查询速度。

假设在数据库中创建一个表,在表上创建一个索引,在表中包含一个LOB列,那么创建表的结果是产生了四个段:表段、索引段、LOB段和LOB索引段。图7.2表示这四个段之间的关系。

figure_0238_0077

图 7.2 数据库对象与段的关系