12.逻辑存储结构
12.1. 逻辑存储结构简介
Oracle数据库为数据库中的所有数据分配逻辑空间。数据库空间分配的逻辑单位是数据块、区间、段和表空间。在物理层面,数据存储在磁盘上的数据文件中(见第11章“物理存储结构”)。数据文件中的数据存储在操作系统块中。图12-1是物理和逻辑存储的实体-关系图。乌鸦脚符号表示一对多关系。
12.1.1. 逻辑存储层次结构
图12-2显示了表空间内数据块、区间和段之间的关系。在这个例子中,一个段有两个区间,存储在不同的数据文件中。
在最细的粒度级别,Oracle数据库将数据存储在数据块中。一个逻辑数据块对应于物理磁盘空间的特定字节数,例如,2 KB。数据块是Oracle数据库可以使用或分配的最小存储单位。
区间是一组逻辑上连续的数据块,为存储特定类型的信息而分配。在图12-2中,24 KB的区间包含12个数据块,而72 KB的区间包含36个数据块。
段是为特定数据库对象(如表)分配的一组区间。例如,员工表的数据存储在其自己的数据段中,而员工的每个索引都存储在其自己的索引段中。每个消耗存储空间的数据库对象都由一个单独的段组成。
每个段都属于且只属于一个表空间。因此,一个段的所有区间都存储在同一个表空间中。在表空间内,一个段可以包含来自多个数据文件的区间,如图12-2所示。例如,一个段的一个区间可能存储在users01.dbf中,而另一个区间可能存储在users02.dbf中。单个区间永远不能跨越数据文件。
12.1.2. 逻辑空间管理
Oracle数据库必须使用逻辑空间管理来跟踪和分配表空间中的区间。当数据库对象需要一个区间时,数据库必须有一种方法来查找和提供它。类似地,当对象不再需要一个区间时,数据库必须有一种方法来使空闲区间可用。Oracle数据库根据您创建的类型在表空间内管理空间。您可以创建以下类型的表空间:
■ 本地管理表空间(默认)
数据库使用表空间本身的位图来管理区间。因此,本地管理表空间有一部分被留作位图。在表空间内,数据库可以使用自动段空间管理(ASSM)或手动段空间管理(MSSM)来管理段。
■ 字典管理表空间
数据库使用数据字典来管理区间(见第6-1页的“数据字典概述”)。
图12-3显示了表空间中逻辑空间管理的替代方案。
12.1.2.1. 本地管理表空间
本地管理表空间在数据文件头部维护一个位图,以跟踪数据文件主体中的空闲和已使用空间。每个位对应一组数据块。当空间被分配或释放时,Oracle数据库会更改位图的值,以反映数据块的新状态。
以下图形是位图管理存储的概念性表示。头部中的1表示已使用空间,而0表示空闲空间。
本地管理表空间具有以下优点:
■ 避免使用数据字典来管理区间
如果在字典管理的表空间中,消耗或释放区间中的空间导致另一个操作消耗或释放数据字典表或撤销段中的空间,则可能会发生递归操作。
■ 自动跟踪相邻的空闲空间
通过这种方式,数据库消除了合并空闲区间的需要。
■ 自动确定本地管理区间的大小
或者,本地管理表空间中的所有区间可以具有相同的大小,并覆盖对象存储选项。
注意:Oracle强烈建议使用自动段空间管理的本地管理表空间。
段空间管理 是从包含段的表空间继承的属性。在本地管理表空间内,数据库可以自动或手动管理段。例如,users表空间中的段可以自动管理,而tools表空间中的段则手动管理。
自动段空间管理 ASSM方法使用位图来管理空间。位图提供以下优点:
■ 简化管理 ASSM避免了手动确定许多存储参数的正确设置的需要。只有一个关键的SQL参数控制空间分配:PCTFREE。此参数指定了为未来更新保留的数据块中的空间百分比(见第12-12页的“数据块中自由空间的百分比”)。
■ 提高并发性
多个事务可以搜索单独的空闲数据块列表,从而减少争用和等待。对于许多标准工作负载,使用ASSM的应用程序性能比使用MSSM的经过良好调整的应用程序性能更好。
■ 在Oracle实时应用集群(Oracle RAC)环境中空间对实例的动态亲和性
ASSM更有效,是永久性本地管理表空间的默认设置。
注意:本章假设在所有关于逻辑存储空间的讨论中都使用ASSM。
手动段空间管理 传统的MSSM方法使用一个名为空闲列表的链表来管理段中的空闲空间。对于有空闲空间的数据库对象,空闲列表跟踪高水位线(HWM)以下的块,这是已使用和尚未使用的段空间之间的分界线。随着块的使用,数据库根据需要将块添加到或从空闲列表中移除。
除了PCTFREE,MSSM还需要您使用SQL参数如PCTUSED、FREELISTS和FREELIST GROUPS来控制空间分配。PCTUSED设置了数据库将其添加到空闲列表的当前使用块中必须存在的空闲空间百分比。例如,如果您在CREATE TABLE语句中将PCTUSED设置为40,则意味着如果一个数据块中至少有40%的空间未被使用,该数据块就会被列入空闲列表。
作为示例,假设您向表中插入一行。数据库检查表的空闲列表以寻找第一个可用块。如果行不能放入块中,并且如果块中已使用的空间大于或等于PCTUSED,则数据库将该块从列表中移除并寻找另一个块。如果您从块中删除行,则数据库会检查块中现在已使用的空间是否小于PCTUSED。如果是这样,那么数据库将该块放置在空闲列表的开头。
一个对象可以有多个空闲列表。通过这种方式,多个会话对表执行DML操作时可以使用不同的列表,这可以减少争用。每个数据库会话在其会话期间只使用一个空闲列表。如图12-4所示,您还可以创建一个具有一个或多个空闲列表组的对象,空闲列表组是空闲列表的集合。每个组都有一个主空闲列表,管理组中的各个进程空闲列表。空闲列表的空间开销,特别是对于空闲列表组,可能会很大。
手动管理段空间可能会很复杂。您必须调整PCTFREE和PCTUSED以减少行迁移(见第12-16页的“链式和迁移的行”)并避免浪费空间。例如,如果段中每个已使用的块都只有一半满了,而PCTUSED是40,那么数据库不允许在这些块中的任何一个中插入新行。由于调整空间分配参数的困难,Oracle强烈推荐使用ASSM。在ASSM中,PCTFREE决定了是否可以将新行插入到块中,但它不使用空闲列表并忽略PCTUSED。
12.1.2.2. 字典管理表空间
字典管理表空间使用数据字典来管理其区间。Oracle数据库在为区间分配或释放重用时,会更新数据字典中的表。例如,当一个表需要一个区间时,数据库会查询数据字典表并搜索空闲区间。如果数据库找到空间,那么它会修改一个数据字典表并插入另一行。通过这种方式,数据库通过修改和移动数据来管理空间。
数据库在后台执行的SQL以获取数据库对象空间是递归SQL。频繁使用递归SQL可能会对性能产生负面影响,因为对数据字典的更新必须序列化。本地管理表空间(默认设置)避免了这种性能问题。
12.2. 数据块概述
Oracle数据库以称为数据块的单位管理数据库数据文件中的逻辑存储空间,数据块也称为Oracle块或页面。数据块是数据库I/O的最小单位。
12.2.1. 数据块和操作系统块
在物理层面,数据库数据存储在由操作系统块组成的磁盘文件中。操作系统块是操作系统可以读取或写入的最小数据单位。相比之下,Oracle块是一个逻辑存储结构,其大小和结构对操作系统是不可见的。图12-5显示操作系统块的大小可能与数据块不同。数据库请求数据是以数据块的倍数进行的,而不是操作系统块。
当数据库请求一个数据块时,操作系统将此操作转换成对永久存储中数据的请求。数据块与操作系统块之间的逻辑分离有以下含义:
■ 应用程序不需要确定磁盘上数据的物理地址。
■ 数据库数据可以在多个物理磁盘上进行条带化或镜像。
12.2.1.1. 数据库块大小
每个数据库都有一个数据库块大小。在创建数据库时,DB_BLOCK_SIZE初始化参数设置了数据库的数据块大小。该大小为SYSTEM和SYSAUX表空间设置,并作为所有其他表空间的默认值。除非重新创建数据库,否则无法更改数据库块大小。如果未设置DB_BLOCK_SIZE,则默认数据块大小取决于操作系统。数据库的标准数据块大小为4 KB或8 KB。如果数据块大小与操作系统块大小不同,则数据块大小必须是操作系统块大小的倍数。
12.2.1.2. 表空间块大小
您可以创建与DB_BLOCK_SIZE设置不同块大小的个别表空间。非标准块大小在将可传输表空间移动到不同平台时很有用。