Oracle从新手到高手
上QQ阅读APP看书,第一时间看更新

2.2 逻辑存储结构

数据库的逻辑结构是从逻辑的角度分析数据库的构成,即创建数据库后形成的逻辑概念之间的关系。在逻辑上,Oracle将保存的数据划分为一个个小单元来存储和维护,高一级的存储单元由一个或多个低一级的存储单元组成。Oracle的逻辑存储单元从小到大依次为:数据块(DATA BLOCKS)、盘区(EXTENT)、段(SEGMENTS)和表空间(TABLE SPACES),下图显示了各逻辑单位之间的关系。

由上图可知,Oracle数据库由多个表空间组成,而表空间又由许多段组成,段由多个盘区组成,盘区又由多个数据块组成。

2.2.1 数据块

数据块是Oracle用来管理存储空间的最小单元,也是执行数据库输入输出操作时的最小单位。相应地,操作系统执行输入输出操作的最小单位为一个操作系统块的大小。在操作系统中,执行I/O操作是以操作系统块为单位的,而在Oracle中,执行的I/O操作以Oracle数据块为单位。

Oracle块的大小是操作系统块大小的整数倍。以Windows NT操作系统为例,NTFS格式的磁盘分区一般为4KB,因此Oracle块的大小为8KB等。数据块的标准大小由初始化参数DB_ BLOCK_SIZE确定,具有标准大小的块称为标准块。Oracle支持在同一个数据库中使用多种大小的块,与标准块大小不同的块称为非标准块。

可以通过查询V$PARAMETER数据字典,获得参数DB_BLACK_SIZE的值,该参数值同时也是数据块的尺寸,例如:

在数据块中可以存储各种类型的数据,如表数据、索引数据、簇数据等。无论数据块中存放何种类型的数据,块都具有相同的结构,下图列出一个Oracle块的基本结构。

数据块的各组成部分分别介绍如下。

※ 块头部:块头部包含块中一般的属性信息,如块的物理地址、块所属的段的类型(如数据段、索引段、回退段等)。

※ 表目录:如果块中存储的数据是表数据(表中一行或多行记录),则表目录中存储关于该表的相关信息。

※ 行目录:如果块中存储的数据为表数据(表中的一行或多行记录),则在行目录中保存这些记录的相关信息。

※ 空闲空间:空闲空间是块中尚未使用的存储空间。当向数据块中添加新数据时,将减小空闲空间。

※ 行空间:行空间是块中已经使用的存储空间,在行空间中存储了数据库对象的数据。例如,表中的一行或多行记录。

块头部、表目录和行目录共同组成块的头部信息区。块的头部信息区中并不存放实际的数据库数据,它只起到引导系统读取数据的作用。因此,如果头部信息区被损坏,则整个数据块将失效,数据块中存储的数据将丢失。而空闲空间和行空间则共同构成块的存储区,空闲空间和行空间的总和就是块的总容量。

2.2.2 盘区

盘区是由一系列物理上连续存放的数据块所构成的Oracle存储结构,由一个或多个数据块组成一个盘区,而一个或多个盘区组成一个段。当一个段中的所有空间被使用后,系统将自动为该段分配一个新的盘区。盘区是Oracle存储分配的最小单位。

在Oracle中创建带有实际存储结构的数据库对象时,Oracle将为对象分配相应的盘区,以构成一个段来提供存储空间。当段中已经分配的区写满后,Oracle将为段分配一个新的区,以便容纳更多的数据库。

2.2.3 段

段是由一系列区组成的,它也不再是存储空间的分配单位,而是一个独立的逻辑存储结构。对于具有独立存储结构的对象,它的数据全部存储在保存它的段中。一个段只属于一个特定的数据库对象,每当创建一个具有独立段的数据库对象时,Oracle将为它创建一个段。例如,在Oracle中创建表时会为它分配若干个区,以组成表的数据段。

在Oracle中,不同类型的数据库对象拥有不同类型的段。根据段中存放的数据库对象类型,可以将段分为几种类型:数据段、索引段、临时段、回退段和LOB段。

1. 数据段

在数据段中保存的是表中的记录。在用户创建表的同时,Oracle系统将为表创建数据段。Oracle中所有未分区的表都使用一个段来保存数据。

当表中的数据增加时,数据段也将变大,数据段的增大过程是通过添加新盘区实现的。在表空间中创建了多少个表,相应地,在该表空间中就有同量的数据段,并且数据段的名称与它对应的表名相同。

2. 索引段

在索引段中保存的是索引中的索引信息。在使用CREATE INDEX语句创建索引,或者在定义约束是自动创建索引的同时,Oracle将为索引创建它的索引段。

3. 临时段

当用户执行查询等操作时,Oracle可能会需要使用到一些临时存储空间,用于临时保存解析过的查询语句,以及在排序过程中产生的临时数据。Oracle会自动在专门用于存储临时数据的表空间为操作分配临时段。

在执行如下几种类型的SQL语句时,Oracle都会在临时表空间中为语句操作分配一个临时段。

※ CREATE INDEX

※ SELECT …ORDER BY

※ SELECT DISTINCT

※ SELECT … GROUP BY

※ SELECT … UNION

※ SELECT … INTERSECT

※ SELECT … MINUS

如果经常需要执行上面类型的语句,最好调整SORT_AREA_SIZE初始化参数来增大排序区,使排序操作尽量能够在内存中完成,以获得更好的性能。

当操作执行完毕后,为该操作分配的临时段将被释放。当带有排序的操作十分频繁时,临时段的分配和释放也将十分频繁,因此为了提高性能,Oracle创建了一个独立的临时表空间,并在其中存放临时段,这样可以避免与其他表空间争用存储空间。

4. 回退段

回退段用于保存回退条目,Oracle将用户修改前的值保存在回退条目中。利用这些信息,用户可以撤销未提交的操作,Oracle则可以利用回退段来维护数据库的读写一致性,并能够在实例崩溃时进行恢复。

在Oracle 11g中,回退也称为“撤销管理”,并且不需要为数据库创建多个回退段,也不需要管理回退段,只需要创建一个撤销表空间。对回退段的管理由Oracle自动完成,就是自动撤销管理。

5. LOB段

如果表中含有如CLOB和BLOB等大对象类型数据时,系统将创建LOB段以存储相应的大型对象数据。LOB段独立于保存表中其他数据的数据段。

2.2.4 表空间

表空间是在Oracle中用户可以使用的最大的逻辑存储结构,用户在数据库中建立的所有内容都被存储在表空间中。Oracle使用表空间将相关的逻辑结构组合在一起,表空间在物理上与数据文件相对应,每个表空间是由一个或多个数据文件组成的,一个数据文件只可以属于一个表空间,这是逻辑与物理的统一。所以存储空间在物理上表现为数据文件,而在逻辑上表现为表空间。数据库管理员可以创建若干个表空间,也可以为表空间增加或删除数据文件。表空间通过数据文件来扩大,表空间大小等于构成该表空间的所有数据文件大小之和。

由于表空间物理上对应了操作系统的一个或多个数据文件,因此在表空间中创建的对象,在物理上可以有如下两种存储方式。

※ 若表空间只对应一个数据文件,该表空间中所有的对象都存储在这个数据文件中。

※ 若表空间对应于多个数据文件,Oracle可将一个对象存储在该表空间的任意一个数据文件中。事实上,Oracle可以将同一个对象的数据分布在表空间的多个数据文件中。

在创建数据库时,Oracle会自动创建一些默认的表空间,其中除了用于存储用户数据的普通表空间外,在一个数据库中还会存在3种类型的表空间:SYSTEM表空间、撤销表空间和临时表空间。这三种表空间的创建、维护与管理都与普通的用户表空间不同,在本节中将分别进行简单介绍。

1. SYSTEM表空间

在每个数据库中,都有一个名为SYSTEM的表空间,即系统表空间。该表空间是在创建数据库时自动创建的,在SYSTEM表空间中存有如下信息。

※ 在SYSTEM表空间中存储数据库的数据字典和内部系统表基表。数据字典是一组保存数据库自身信息的内部系统表和视图。

※ 在SYSTEM表空间中存储所有PL/ SQL程序的源代码和解析代码,包括存储过程、函数、包和触发器等。在需要保存大量PL/SQL程序的数据库中,应当设置足够大的SYSTEM表空间。

※ 在SYSTEM表空间中存储数据库对象(如视图、对象类型说明、同义词和序列)的定义。当在数据库中创建一个新的对象时,对象的实际数据可以存储在其他表空间中,但对象的定义信息却保存在SYSTEM表空间中。

通过使用如下的语句,可以查看数据库中数据字典的信息。

     select * from dict

查看内部系统表的SQL。

     select * from v$fixed_view_
definition

数据库管理员DBA对数据库系统中的数据字典必须有一个很深刻的了解,必须准备一些基础的SQL语句,通过这些SQL语句可以立即了解系统的状况和数据库的状态。大量的读取操作、少量的写入操作是该表空间的一个显著的特点。

因此SYSTEM表空间对于Oracle数据库而言是至关重要的。一般在SYSTEM表空间中只应该保存属于SYS模式的对象,即与Oracle自身相关的数据,而用户的对象和数据都应当保存在非SYSTEM表空间中。另外,在Oracle 10g和11g中,Oracle新增了表空间SYSAUX,以此作为SYSTEM表空间的辅助表空间,SYSAUX表空间一般不用于存储用户数据,并由Oracle系统内部自动维护。

2. 撤销表空间

撤销表空间是特殊的表空间,它专门用来在自动撤销管理方式下存储撤销信息,即回退信息。当数据库进行更新、插入、删除等操作时,新的数据被更新到原来的数据文件中,而旧的数据就被放到撤销段中。如果数据需要回滚,那么可以从撤销段将数据再复制到数据文件中,来完成数据的回退。在系统恢复时,撤销段可以用来撤销没有被提交的数据,解决系统的一致性问题。

除了撤销段外,在撤销表空间中不能建立任何其他类型的段,即任何数据库用户都不能在撤销表空间中创建数据库对象(如表、索引等)。在撤销表空间中,存在大量的写入操作,而只有少量的读取操作。

数据库管理员可以为数据库创建多个撤销表空间,但是每个数据库实例最多只能使用一个撤销表空间。在使用DBCA创建数据库时,一般会自动建立一个默认的撤销表空间UNDOTBS。在建立数据库后,也可以根据需要创建其他的撤销表空间,并设置数据库实例所使用的撤销表空间。

3. 临时表空间

在实例运行过程中,Oracle必须使用一些临时空间来保存SQL语句在执行过程中所产生的临时数据。在Oracle 11g中,系统为所有数据库用户指定了一个专门的临时表空间TEMP。在使用DBCA创建数据库时,会自动建立默认的临时表空间TEMP。此外,在数据库已经建立以后,也可以使用CREATE TEMPORARY TABLESPACE语句来创建其他的临时表空间。

在临时表空间中,同一个实例中的所有SQL语句的排序操作将共享使用一个排序段。排序段在执行第一条具有排序操作的SQL语句时被创建,在实例关闭时被释放。