1.2 Oracle逻辑存储结构
Oracle数据库中的数据文件被分组到一个或多个表空间中。在每个表空间中,逻辑数据库结构(如表和索引)都是片段,被进一步细分为“盘区”(extent)和“块(block)”。这种存储的逻辑细分允许Oracle更有效地控制磁盘空间的利用率。图1-2显示了数据库中逻辑存储结构之间的关系。
图1-2 逻辑存储结构
1.2.1 表空间
Oracle表空间(tablespace)由一个或多个数据文件组成,一个数据文件是且只能是一个表空间的一部分。对于Oracle 12c的安装,最少会创建两个表空间:SYSTEM表空间和SYSAUX表空间。Oracle 12c的默认安装创建6个表空间。
Oracle 10g及后续版本允许创建特殊类型的表空间,称为大文件表空间(bigfile tablespace),其容量最大可为128TB。使用大文件可使表空间管理对DBA完全透明可见,换句话说,DBA可以将表空间作为一个单位进行管理,而不必考虑底层数据文件的大小和结构。
使用Oracle管理文件(Oracle Managed File,OMF)可使表空间数据文件管理更为容易。使用OMF,DBA可在文件系统中指定一个或多个位置来驻留数据文件、控制文件和重做日志文件,并由Oracle自动处理这些文件的命名和管理。第4章将更详细地讨论OMF。
即使表空间是临时的,表空间自身也是永久的,只有保存在表空间中的段是临时的。临时表空间可用于排序操作,也用于只存在于用户会话期间的表。专门使用一个表空间用于此类操作,有助于减少临时段和存储在另一个表空间中的永久段(如表)之间的I/O争用。
表空间可以是字典管理的或本地管理的。在字典管理的表空间中,盘区管理记录在数据字典表中。因此,即使所有的应用程序表都在USERS表空间中,也仍需要访问SYSTEM表空间,以管理应用程序表上的DML。因为所有用户和应用程序必须使用SYSTEM表空间才能进行盘区管理,这就为写入密集型应用程序造成了潜在的瓶颈。在本地管理的表空间中,Oracle在表空间的每个数据文件中维护一个位图,用于跟踪空间可用性。只有数据字典中管理分配额,可极大地减少数据字典表的争用。其实没什么好的理由来创建字典管理的表空间。在安装Oracle 12c时,必须在本地管理SYSTEM和SYSAUX表空间。为了导入可传输的表空间,表空间可由字典管理,但将是只读的。
1.2.2 块
数据库块是Oracle数据库中最小的存储单位。块的大小是数据库内给定表空间中特定数量的存储字节。
块通常是操作系统块的几倍大,这有助于提升磁盘I/O的效率。Oracle初始参数DB_BLOCK _SIZE指定默认的块大小。最多可为数据库中的其他表空间定义4个块大小,而SYSTEM、SYSAUX和任何临时表空间中的块大小必须为DB_BLOCK_SIZE的值。
默认块大小是8KB,所有Oracle测试都使用8KB块执行。Oracle最佳实践指出,除非确有必要使用不同大小,否则应为所有表空间使用8KB块大小。一个原因可能是表的平均行大小是20KB。因此,可选用32KB块,但应该进行全面测试,看一下能否提升性能。
1.2.3 盘区
盘区是数据库中的下一个逻辑分组级别,它由一个或多个数据库块组成。当扩大数据库对象时,为该对象添加的空间将分配为一个盘区。
1.2.4 段
数据库中的下一个逻辑分组级别是段。段是一组盘区,这组盘区组成了被Oracle视为一个单位的数据库对象,如表或索引。因此,段一般是数据库终端用户要处理的最小存储单位。Oracle数据库中可看到4种类型的段:数据段(非分区表和分区表的每个分区)、索引段、临时段和回滚段。
1.数据段
数据库中的每个表都驻留在单独的数据段中,数据段由一个或多个盘区组成。如果某个表是分区表(partitioned table)或群集表(clustered table),则Oracle为该表分配多个段。本章稍后将讨论分区表和群集表。数据段包含存储LOB(大对象)数据的LOB段,LOB数据由数据段中的LOB定位器列引用(假定LOB不是以内联方式存储在表中)。
2.索引段
每个索引都存储在自己的索引段中。与分区表一样,分区索引的每个分区存储在各自的段中。这种索引段包含的是LOB索引段,而表的非LOB列、表的LOB列以及LOB的相关索引都可以驻留在各自的表空间中,以提高性能。
3.临时段
当用户的SQL语句需要磁盘空间来完成某操作(例如不能在内存中完成的排序操作)时,Oracle会分配临时段。临时段只存在于SQL语句的持续期间。
4.回滚段
从Oracle 10g开始,遗留的回滚段只存在于SYSTEM表空间中,并且DBA一般不需要维护SYSTEM回滚段。在以前的Oracle版本中,当事务回滚时,会创建回滚段以保存数据库DML操作之前的值,并且用于维护“之前”的图像数据,从而为访问表的其他用户提供表数据的读一致性视图。回滚段也用于在数据库恢复期间回滚未提交的事务,这些事务在数据库实例崩溃或异常终止时活动。
自动撤消管理(Automatic Undo Management,AUM)处理一个撤消表空间中回滚段的自动分配和管理。在撤消表空间中,撤消段的构造类似于回滚段,不同之处在于如何管理这些段的细节由Oracle控制,而不由DBA管理(通常效率低)。从Oracle 9i开始就存在自动撤消段,但在Oracle 12c中仍可手动管理回滚段。然而,从Oracle 10g开始不赞成使用这种功能,在后续版本中该功能将不再可用。在Oracle 12c中,默认启用AUM,此外还提供了PL/SQL过程,以帮助确定UNDO表空间的大小。第7章将详细讨论自动撤消管理。