1.1.1 Oracle逻辑存储结构
Oracle Database中的数据文件被组合成一个或多个表空间。数据文件是物理结构,可进而分成区间和块。一个表空间有点像一组数据文件的逻辑包装器。表空间包含粒度更小的逻辑数据库结构,如表和索引。使用的另一个术语是段,在Oracle Database中,此术语用来描述表或索引占用的物理空间。Oracle Database的条块划分方式允许更高效地控制磁盘空间的使用。图1-1显示数据库中逻辑存储结构之间的关系。
图1-1 逻辑存储结构
1.表空间
Oracle表空间由一个或多个数据文件组成;数据文件必须正好是一个表空间的一部分。Oracle Database 12c的安装会至少创建两个表空间:SYSTEM和SYSAUX表空间。Oracle Database 12c的默认安装创建6个表空间。
Oracle Database 12c(以及自Oracle Database 10g以来的数据库)允许创建名为“大文件表空间”的特殊类型的表空间,此表空间的大小可达128TB。使用大文件后,表空间管理对于数据库管理员(DBA)完全透明;也就是说,DBA可将表空间作为一个单元进行管理,而无须考虑底层数据文件的大小和结构。
使用Oracle管理文件(Oracle Managed Files, OMF),管理表空间数据文件将变得更容易。有了OMF, DBA在文件系统中指定保存数据文件、控制文件和重做日志文件的一个或多个位置,Oracle会自动处理这些文件的命名和管理。
如果表空间是临时的,只是表明表空间中保存的段是临时的,而表空间本身是永久的。可将临时表空间用于排序操作和仅在用户会话期间存在的表,为这些操作类型专门指定表空间有助于减少临时段和另一个表空间中存储的永久段(如表)的I/O争用。
表空间可以是字典管理的表空间或本地管理的表空间。在字典管理的表空间中,会将区间管理记录在数据字典表中。因此,即使所有应用程序表在USERS表空间中,仍然是访问SYSTEM表空间来管理应用程序表上的数据操作语言(Data Manipulation Language, DML)。由于所有用户和应用程序必须使用SYSTEM表空间来管理区间,对于密集执行写操作的应用程序而言,这成为一个潜在的瓶颈。而在本地管理的表空间中,Oracle在表空间的每个数据文件的头中维护一个位图来跟踪空间可用性。只在数据字典中管理配额,这极大地降低了数据字典表的争用率。
从Oracle 9i开始,如果在本地管理SYSTEM表空间,那么,如果要在其他所有表空间上同时执行读写操作,则必须在本地管理这些表空间。在本地管理SYSTEM表空间的情况下,数据库中字典管理的表空间必须是只读的。
2.块
数据库块是Oracle中的最小存储单元。块的大小是数据库给定表空间中的特定存储字节数。
为提高磁盘I/O性能的效率,Oracle块的大小通常是操作系统块大小的倍数。默认块大小由Oracle初始化参数DB_BLOCK_SIZE指定。大多数操作系统允许在数据库的其他表空间中定义另外4种块大小。一些高端操作系统允许使用5种块大小。SYSTEM、SYSAUX和任何临时表空间中的块大小必须是DB_BLOCK_SIZE。
3.区间
区间是下一个级别的数据库逻辑分组。一个区间由一个或多个数据库块组成。扩大数据库对象时,为对象添加的空间作为区间进行分配。Oracle在数据文件级别管理区间。
4.段
下一个逻辑分组级别是段。段是一组区间,这些区间形成Oracle视为一个单元的数据库对象,如表或索引。因此,段通常是数据库最终用户将要处理的最小存储单元。Oracle数据库中的4种段类型是:数据段、索引段、临时段和撤消段。
数据库中的每个表保存在单个数据段中,一个数据段由一个或多个区间组成;对于分区表或群集表,Oracle会为表分配多个段。数据段包括LOB(large object,大对象)段,此段存储表段中的LOB定位器列引用的LOB数据(如果未将LOB以内联方式存储在表中)。
每个索引存储在自己的索引段中。与分区表一样,分区索引的每个分区存储在专门的段中。这种类别包括LOB索引段。表的非LOB列、表的LOB列和LOB的相关索引均可以保存在不同的表空间(不同的段)中以提高性能。
如果用户的SQL语句需要磁盘空间来完成操作,例如内存中容纳不下的排序操作,Oracle会分配临时段。仅在执行SQL语句期间存在临时段。
从Oracle 10g开始,只有SYSTEM表空间中存在手动回滚段,但DBA通常不必维护SYSTEM回滚段。在前面的Oracle版本中,会创建回滚段,以便在回滚事务时保存数据库DML操作的旧值,并维护“旧”映像数据,以便为其他访问此表的用户提供表数据的读一致性视图。在恢复数据库期间,为回滚在数据库实例崩溃或异常终止时处于活动状态的未提交事务,也会使用回滚段。
在Oracle 10g到12c中,自动撤消管理(Automatic Undo Management)处理撤消表空间中的回滚段的自动分配和管理。在撤消表空间中,撤消段的结构与回滚段类似,只是这些段的管理细节由Oracle控制,而非由DBA管理(这样做效率通常不高)。从Oracle9i开始使用自动撤消管理,但在Oracle 10g中仍然可以使用手动管理的回滚段。但是,从Oracle 10g开始不赞成使用此手动功能。在Oracle Database 12c中,会默认启用自动撤消管理;另外,提供了PL/SQL(Procedural Language/Structured Query Language,过程语言/结构化查询语言)过程来帮助调整UNDO表空间的大小。
提示:
如果开始使用Oracle Database 12c,你真正需要了解的是:手动回滚是多余的,在未来版本中会予以取消。另外,自动撤消管理是Oracle Database 12c的一项标准功能。