逻辑存储结构
逻辑存储结构 是Oracle数据库存储结构的核心内容,对Oracle数据库的所有操作都会涉及其逻辑存储结构。逻辑存储是从逻辑的角度分析数据库的构成,是对数据存储结构在逻辑概念上的划分。
Oracle的逻辑存储是一种层次结构,主要由表空间、段、数据区和数据块等概念组成。逻辑结构是面向用户的,当用户使用Oracle设计数据库时,其使用的就是逻辑存储结构。Oracle的逻辑存储结构中所包含的多个结构对象是从数据块到表空间形成了不同层次的粒度关系

数据块
数据块 是Oracle逻辑存储结构中最小的逻辑单位,也是执行数据库输入/输出操作的最小存储单位。Oracle数据存放在Oracle数据块中,而不是操作系统中。
Oracle数据块通常是操作系统块的整数倍,如果操作系统块的大小为2048B,并且Oracle数据块的大小为8192B,则表示Oracle数据块有4个操作系统块构成。Oracle数据块有一定的标准大小,其大小被写入初始化参数DB_BLOCK_SIZE中。另外,Oracle支持在同一个数据库中使用多种大小的快,与标准块大小不同的快就是非标准块。
数据块由块头、表目录、行目录、空余空间和行数据这5部分组成。

- 行头:存放数据块的基本信息,如块的物理地址、块所属的段的类型。
- 表目录:存放表的相关信息。如果数据块中存储的数据是表数据,则表目录中存储有关这些表的相关信息。
- 行目录:如果块中有行数据存在,则这些行的信息将被记录在行目录中。这些信息包括行地址等。
- 空余空间:块中未使用的区域,用于新行的插入和已经存在的行的更新。
- 行数据 :用于存放表数据和索引数据的地方,这部分空间已经被数据行所占用。
通常把块头、表目录、行目录这3部分组合起来成为头部信息区。头部信息区中存放数据,而是存放整个块的引导信息,起到引导系统读取数据的作用。头部信息区若遭到破坏,则Oracle系统将无法读取这部分数据。
空余空间和行数据公共构成块的存储区,用于存放真正的数据记录。
数据区
数据区 是由一组连续的Oracle数据块构成的Oracle存储结构,一个或多个数据块组成一个数据区,一个或多个数据区再组成一个段。当一个段中所有空间都被使用完后,Oracle系统自动为该段分配一个新的数据区,可见数据区是Oracle存储分配的最小单位,Oracle就以数据区为单位进行存储控件的扩展。
使用数据区的目的是用来保存特定数据类型的数据,也是表中数据增长的基本单位。在Oracle数据库中,分配存储空间就是以数据区为单位的,一个Oracle对象至少包含一个数据区,设置一张表或索引的存储参数包含设置它的数据区大小。
段
段 是由一个或多个数据区组成的,它不是存储空间的分配单位,而是一个独立的逻辑存储结构,用于存储表、索引或簇等占用空间的数据对象,Oracle也把这种占用空间的数据对象统一称为段。一个段只属于一个特定的数据对象,每当创建一个具有独立段的数据对象时,Oracle将为它创建一个段。
段是为特定的数据对象(如表、索引、回滚等)分配的一系列数据区。段内包含的数据区可以不连续,并且可以跨越多个文件,使用段的目的是用来保存特定对象的。
一个Oracle数据库中通常包含包含以下四种类型的段:
- (1)数据段:数据段中保存的是表中的数据记录。在创建数据表时Oracle系统将为表创建数据段。表中数据量增大时,数据段的大小自然也随着增大,数据段的增大过程是通过向其添加新的数据区来实现的。当创建一张表时,系统自动创建一个以该表的名字命名的数据段。
- (2)索引段:索引段中包含了用于提高系统性能的索引。一旦建立了索引,系统就会自动创建一个以该索引的名字命名的索引段。
- (3)回滚段:回滚段中保存了回滚条目,Oracle将修改前的旧值保存在回滚条目中。利用这些信息,可以撤销未提交的操作。当一个事物开始处理时,系统为之分配回滚段,回滚段可以动态创建和撤销。Oracle系统有个默认的回滚段,其管理方式既可以是自动的也可以是手动的。
- (4)临时性 :当执行创建索引、查询等操作时,Oracle可能会使用一些临时存储空间,用于暂时性的保存解析过的查询语句以及在排序过程中产生的临时数据。Oracle系统将在专门用于存储临时数据的表空间中为操作分配临时段。
在执行CREATEINDEX(创建索引)、SELECT ORDER BY(排序结果集)、SELECT DISTINCT(去重)和SELECT GROUP BY(分组聚合)等几种类型的SQL语句时,Oracle系统就会在临时表空间中为这些语句的操作分配一个临时段。
在数据库管理过程中,若经常需要执行上述这类SQL语句,最好调整SORT_AREA_SIZE初始化参数来增大排序区,从而使排序操作尽量能够在内存中完成,以获得更好的执行效率,但同时这对数据库服务器的内存空间提出了更大的要求。
表空间
Oracle使用表空间将相关的逻辑结构(如段、数据区)组合在一起,表空间是数据库的最大逻辑划分区域,通常是用来存放数据表、索引、回滚段等数据对象,任何数据对象在创建时都必须被指定存储在某个表空间中。表空间(属于逻辑存储结构)与数据文件(属于物理存储结构)相对应,一个表空间由一个或多个数据文件组成,一个数据文件只属于一个表空间。
Oracle数据的存储空间在逻辑上表现为表空间,在物理上表现为数据文件。表空间的大小等于所有从属于它的数据文件大小的总和。
由于表空间在物理上(即磁盘上)包含操作系统中的一个或者多个数据文件,因此在表空间中创建的数据对象存在以下两种情况:
- (1)若表空间只包含一个数据文件,则该表空间中的所有对象都存储在这个数据文件中。
- (2)若表空间包含多个数据文件,则Oracle即可将数据对象存储在该表空间的任意一个数据文件中,也可以将用一个数据对象中的数据分布在表空间的多个数据文件中。
在创建数据库时,Oracle系统会自动创建多个默认的表空间,这些表空间除了用于管理用户数据的表空间之外,还包括用于管理Oracle系统内部数据(如数据字典)的表空间。
以下为一些默认创建的主要表空间:
- (1)SYSTEM表空间------系统表空间。它用于才存放Oracle系统内部表和数据字典的数据,如表名、列名、用户名等。Oracle本身不赞成将用户创建的表、索引等存放在系统表空间中。表空间中的数据文件个数不是固定不变的,可以根据需要向表空间中追加新的数据文件。
- (2)SYSAUX表空间。它是Oracle新增加的表空间,是随着数据库的创建而创建的,它充当SYSTEM的辅助表空间,降低了SYSTEM表空间的负荷,主要存储除数据字典以外的其他数据对象。SYSAUX表空间一般不存储用户的数据,由Oracle系统内部自动维护。
- (3)UNDO表空间------撤销表空间。它用于存储撤销信息的表空间。当用户对数据表进行修改操作(包括插入、更新、删除等操作)时,Oracle系统自动使用撤销表空间来临时存储修改前的旧数据。在所做的修改操作完成并执行提交命令后,Oracle根据系统设置的保留时间长度来决定何时释放掉撤销表空间的部分空间。一般在创建Oracle实例后,Oracle系统自动创建一个名字为UNDOTS1的撤销表空间,该撤销表空间对应的数据文件时UNDOTBS01.DBF。
- (4)USER 表空间------用户表空间。它是Oracle建议用户使用的表空间,可以在这个表空间上创建各种数据对象。例如,创建表、索引、用户等数据对象,Oracle系统的样例用户scott就在UNSER表空间中。
除了Oracle系统默认创建的表空间之外,用户可根据应用系统的实际情况及所要存储的对象类型来创建多个自定义的表空间,以区分用户数据和系统数据。此外,不同应用系统的数据应存储在不同的表空间上,而不同表空间的文件应存储在不同的盘上,以减少I/O冲突,进而提高应用系统的操作性能。