4.6 数据库的逻辑结构

前面已经提到,数据库服务器包括实例和数据库两部分。其中数据库是用来存储数据的,而实例是用来访问数据库中的数据的。实例包括一组内存结构和后台进程,而数据库的结构需要从逻辑结构和物理结构两个方面来理解。数据库的逻辑结构是指数据的逻辑组织形式,是Oracle内部用来管理数据的机制。数据库的物理结构是从用户角度感觉到的结构,是在操作系统中存储和管理数据的机制。

从逻辑结构上来讲,一个数据库包含若干个表空间,不同类型的数据存储在不同的表空间中,如系统数据、用户数据、临时数据和回滚数据等分别存储在不同的表空间中。表空间中包含若干个段,同一个表空间中的数据又可进一步根据类型不同而存储在不同的段中,如数据段、索引段、临时段等。一个段中又可以包含若干个区,区是Oracle分配存储空间和回收存储空间的基本单位。区是由连续的多个数据块组成的,数据块是Oracle读写数据库的基本单位。表空间、段、区和数据块组成了数据库的逻辑结构。

逻辑结构是指数据的组织形式,而从物理形式上讲,数据是以数据文件的形式存储在磁盘上的。在操作系统中,能使用户真正感觉到数据库存在的是数据文件。数据文件是存储在磁盘上的,它需要占用若干个操作系统块。

逻辑结构和物理结构并非毫无关系,而是紧密联系的。表空间中的数据是存放在数据文件中的,因此一个表空间对应一个或多个数据文件。数据块是Oracle中存储数据的基本单位,一个数据块对应若干个操作系统块,数据最终是存储在操作系统块中的,Oracle对数据块的访问最终转化为对操作系统块的访问。

数据库的逻辑结构与物理结构之间的关系如图4.7所示。

figure_0180_0039

图 4.7 数据库的物理逻辑结构和物理结构

4.6.1 表空间

表空间是数据库中数据的逻辑组织形式,一个数据库在逻辑上由多个表空间组成。表空间用于将不同类型的数据组织在一起,就像一个公司里的员工是按照不同部门组织在一起一样。表空间中的数据在物理上是存储在数据文件中的,一个表空间对应一个或多个数据文件,就像一个部门对应若干个办公室一样。当表空间中的存储空间紧张时,可以向表空间中添加数据文件,一个数据文件只能属于一个表空间。

如果表空间中只包含一个数据文件,那么所有数据都将存储在这个数据文件中。如果表空间对应多个数据文件,那么数据将被分割成几部分,分别存放在这些数据文件中。表空间与数据文件的关系如图4.8所示。

figure_0180_0040

图 4.8 表空间与数据文件

在数据库中引入表空间的好处有以下几点:

·将系统数据和用户数据分开,有利于保护重要的数据。

·可以限制用户对磁盘存储空间的使用。

·将临时数据与用户数据分开,从而减少用户数据存储区的碎片,提高数据库的性能。

·能够将不同类型的数据分别存放在不同的磁盘上,以减少磁盘的读写冲突。可以将访问频繁的数据存储在速度相对较快的磁盘上,从而在整体上提高数据库的性能。

·各个表空间可以被单独设置为联机或脱机状态,这样可以在数据库正常运行的情况下,将单个表空间置于脱机状态,并对其进行备份或恢复。

在一个数据库中有五种类型的表空间,即SYSTEM表空间、SYSAUX表空间、UNDO表空间、临时表空间和普通表空间。其中前四种表空间是必不可少的,在创建数据库时就需要创建它们,普通表空间是根据需要才创建的。

1.SYSTEM表空间

SYSTEM表空间是数据库中一个必需的表空间。在创建数据库时,SYSTEM表空间将被自动创建。在SYSTEM表空间中存储着数据库的系统信息,如数据字典,数据库对象的定义、PL/SQL存储程序的代码、SYSTEM回滚段等。

2.SYSAUX表空间

SYSAUX表空间也是数据库中一个必需的表空间,它是在创建数据库时自动被创建的。SYSAUX表空间是对SYSTEM表空间的辅助表空间,以前存储在SYSTEM表空间中的数据现在存储在SYSAUX表空间中,从而减轻了SYSTEM表空间的负担。另外,许多以前需要单独表空间的数据现在都可以存储在SYSAUX表空间中,从而减少了需要维护的表空间的数目。

3.UNDO表空间

UNDO表空间是用来存储回滚数据的。回滚数据是被事务修改的数据,例如,假设用户执行语句“DELETE FROM emp WHERE empno=7902”。被DELETE命令访问的数据就是回滚数据。在事务尚未提交之时,这一行数据被存放在UNDO表空间中。此时假设另一个用户执行语句“SELECT*FROM emp WHERE empno=7902”,那么他将得到从UNDO表空间中返回的这一行数据。如果事务被回滚,UNDO表空间中的数据被写回原来的存储空间,就好像原来的DML操作没有被执行一样。

由此可见,UNDO表空间是为了回滚事务而设计的。在以前版本的数据库中,回滚数据只能存放在回滚段中。回滚段位于某一个表空间中,或者某些特定的表空间中。回滚段的管理比较复杂,需要数据库管理员手工执行繁琐的命令。目前版本的数据库都使用UNDO表空间来管理回滚数据。在UNDO表空间中只能存放回滚段,而不能存放其他类型的段,如数据段、索引段等。使用UNDO表空间好处是对回滚数据进行自动管理,从而减轻了数据库管理员的负担。

4.临时表空间

临时表空间用于存放用户访问数据库时所产生的临时数据。例如,当用户执行语句“SELECT*FROM emp ORDER BY empno”时,将对表中的数据进行排序并产生排序结果。排序操作一般是在PGA的排序区中进行的。如果排序区的大小不足以容纳这些数据,将使用临时表空间。在临时表空间中只能建立临时段。临时段也不是永久存在的,当用户第一次在数据库中执行排序等操作时,临时段将自动产生,而当数据库关闭时临时段的空间将被释放。正是由于这个原因,在临时表空间不允许创建永久性的数据库对象,如表、索引等。

在一个数据库中可以创建多个临时表空间。如果没有临时表空间,那么用户在执行排序等操作时可能需要使用SYSTEM表空间存储临时数据。如果在SYSTEM表空间中频繁地存储临时数据,将产生大量的存储碎片,从而降低数据库的性能。

在使用CREATE USER命令创建用户时,可以通过TEMPORARY TABLESPACE子句为该用户指定临时表空间。用户在创建之后,也可以通过ALTER USER命令为其指定临时表空间。这样用户访问数据库时产生的临时数据将被存储在指定的临时表空间中。

5.普通表空间

普通表空间是用户真正关心的表空间,在数据库中可以创建多个普通表空间。普通表空间用来存放用户的数据。