逻辑存储结构
本章介绍逻辑存储结构的性质和关系。这些结构由 Oracle AI Database 创建和识别,并且操作系统无法识别。
-
Logical Storage Structures 简介:Oracle AI Database 为数据库中的所有数据分配逻辑空间。
-
数据块概览 Oracle AI Database 在称为数据块(也称为 Oracle 块或页)的单元中管理数据库数据文件中的逻辑存储空间。数据块是数据库 I/O 的最小单元。
-
区概览区是由逻辑上连续的数据块组成的数据库存储单元。由于实施 RAID 条带和文件系统,区中的数据块可以物理分散在磁盘中。
-
段概览 段是包含表空间内某个逻辑存储结构的所有数据的一组区。
-
表空间概览 表空间是段的逻辑存储容器。
逻辑存储结构简介
Oracle AI Database 为数据库中的所有数据分配逻辑空间。
数据库空间分配的逻辑单元是数据块、区、段和表空间。在物理级别,数据存储在磁盘上的数据文件中。数据文件中的数据存储在操作系统块中。
下图是用于物理和逻辑存储的实体关系图。鸦脚的表示法表示一对多关系。
图 1:逻辑和物理存储

逻辑存储层次结构
段包含一个或多个区,每个区包含多个数据块。
下图显示了表空间内数据块、区和段之间的关系。在此示例中,一个段具有存储在不同数据文件中的两个区。
图 2:表空间中的段、区和数据块

从最低粒度级别到最高级别,Oracle AI Database 按如下方式存储数据:
-
数据块是 Oracle AI Database 中数据存储的最小逻辑单元。
一个逻辑数据块对应于特定字节数的持久性存储,例如 2 KB。数据块是 Oracle AI Database 可使用或分配的最小存储单元。
传统上,数据文件存储在磁性磁盘或固态磁盘 (SSD) 上。Oracle AI Database 还支持持久性内存 (PMEM) 来存储数据库文件。无论底层数据的物理存储方式如何,Oracle 进程始终读取和写入逻辑数据块。
-
区是为存储特定类型的信息分配的一组逻辑上连续的数据块
在上图中,24 KB 区具有 12 个数据块,而 72 KB 区具有 36 个数据块。
-
A segment is a set of extents allocated for a specific database object, such as a table.
例如,
employees表的数据存储在其自己的数据段中,而employees的每个 index 都存储在自己的索引段中。每个消耗存储的数据库对象均由单个段组成。 -
表空间是包含一个或多个段的数据库存储单元。
每个段属于一个且只属于一个表空间。因此,一个段的所有区均存储在相同的表空间中。在表空间中,段可以包括来自多个数据文件的区,如上图中所示。例如,段的一个区可以存储在
users01.dbf中,而另一个区可以存储在users02.dbf中。单个区永远不能跨越数据文件。
另请参见:“物理存储结构简介”
逻辑空间管理
Oracle AI Database 必须使用逻辑空间管理来跟踪和分配表空间中的区。
当数据库对象需要某个区时,数据库必须具有查找和提供该区的方法。同样,当对象不再需要区时,数据库必须具有使可用区可用的方法。
Oracle AI Database 根据您创建的类型管理表空间中的空间。可以创建以下任一类型的表空间:
-
本地管理的数据库(默认)
数据库使用表空间本身中的位图来管理区。因此,本地管理的表空间的某个部分供位图设置。在表空间中,数据库可以使用自动段空间管理 (ASSM) 或手动段空间管理 (MSSM) 来管理段。
-
字典管理的表空间
数据库使用数据字典来管理区。
图 15-3 显示了表空间中逻辑空间管理的替代方案。
图 3:逻辑空间管理

本地管理的表空间
本地管理的表空间在数据文件头中维护位图,以跟踪数据文件正文中的空闲空间和已用空间。
每个位对应一组块。分配或释放空间时,Oracle AI Database 会更改位图值以反映块的新状态。
下图是位图管理的存储的概念表示形式。头中的 1 表示已用空间,而 0 表示空闲空间。
图 4:位图管理的存储

本地管理的表空间具有以下优点:
-
避免使用数据字典管理区
如果在一个区内占用或释放空间导致另一个操作占用或释放数据字典表或还原段中的空间,则可以在字典管理的表空间中执行递归操作。
-
自动跟踪相邻的空闲空间
这样,数据库就不再需要合并空闲区。
-
自动确定本地管理的区的大小
或者,在本地管理的表空间中所有区的大小可以相同,并且可以覆盖对象存储选项。注:Oracle 强烈建议将本地管理的表空间与自动段空间管理结合使用。
段空间管理是从包含该段的表空间继承的属性。在本地管理的表空间中,数据库可以自动或手动管理段。例如,可以手动管理表空间 tools 中的段时,自动管理表空间 users 中的段。
-
自动段空间管理 自动段空间管理 (Automatic Segment Space Management,ASSM) 方法使用位图管理表空间中的空间。
-
手动段空间管理 传统的手动段空间管理 (Manual Segment Space Management,MSSM) 方法使用称为空闲列表的链接列表来管理段中的空闲空间。
自动段空间管理
automatic segment space management (ASSM) 方法使用位图管理表空间中的空间。
位图具有以下优点:
-
简化管理
ASSM 避免了手动确定许多存储参数的正确设置。只有一个关键的 SQL 参数控制空间分配:
PCTFREE。此参数指定要在块中为将来更新保留的空间百分比(请参阅“数据块中的空闲空间百分比”)。 -
增加并发
多个事务处理可以搜索空闲数据块的单独列表,从而减少争用和等待。对于许多标准工作负载,使用 ASSM 的应用程序性能优于使用 MSSM 的经过良好优化的应用程序的性能。
-
空间与 Oracle Real Application Clusters (Oracle RAC) 环境中的实例的动态关联
ASSM 更高效,是本地管理的永久表空间的默认值。
注:本章假定 ASSM 在逻辑存储空间的所有讨论中使用。
手动段空间管理系统
传统 manual segment space management (MSSM) 方法使用称为空闲列表的链接列表来管理段中的空闲空间。
对于具有空闲空间的数据库对象,空闲列表将跟踪高水位标记 (High Water Mark,HWM) (High Water Mark,HWM) 下的块,这是所使用和尚未使用的段空间之间的分隔线。在使用块时,数据库会根据需要将块置于空闲列表中或从空闲列表中删除块。
除了 PCTFREE,MSSM 还要求您使用 SQL 参数(例如 PCTUSED、FREELISTS 和 FREELIST GROUPS)控制空间分配。PCTUSED 设置当前使用的块中必须存在的空闲空间百分比,以便数据库将其放入空闲列表中。例如,如果在 CREATE TABLE 语句中将 PCTUSED 设置为 40,则在使用不到 40% 的块空间之前,无法将行插入段中的块。
例如,假设在表中插入一行。数据库检查表的空闲列表以查找第一个可用块。如果该行不适合该块,并且该块中的已用空间大于或等于 PCTUSED,则数据库将从列表中删除该块并搜索其他块。如果从块中删除行,则数据库将检查块中的已用空间现在是否小于 PCTUSED。如果是这样,则数据库会将块放置在空闲列表的开头。
一个对象可以有多个空闲列表。通过这种方式,对表执行 DML 的多个会话可以使用不同的列表,从而减少争用。每个数据库会话在其会话期间仅使用一个空闲列表。
如图 15-5 中所示,您还可以创建包含一个或多个空闲列表组的对象,这些组是空闲列表的集合。每个组都有一个主空闲列表,用于管理组中的各个进程空闲列表。空闲列表(尤其是空闲列表组)的空间开销可能很大。
图 5:自由列表组

手动管理段空间可能很复杂。您必须调整 PCTFREE 和 PCTUSED 以减少行迁移并避免浪费空间。例如,如果段中的每个已用块都已满一半,并且 PCTUSED 为 40,则数据库不允许插入到这些块中的任何块。由于微调空间分配参数的难度,Oracle 强烈建议使用 ASSM。在 ASSM 中,PCTFREE 确定是否可以将新行插入块,但不会使用空闲列表并忽略 PCTUSED。
另请参见:
-
“链接行和移植行”
-
Oracle AI Database Administrator’s Guide,了解本地管理的表空间
-
Oracle AI Database Administrator’s Guide,了解有关自动段空间管理的更多信息
-
Oracle AI Database SQL Language Reference,了解存储参数,例如
PCTFREE和PCTUSED
字典管理的表空间
字典管理的表空间使用数据字典来管理其区。
只要某个区已被分配或释放,可以重复使用,Oracle AI Database 就会更新数据字典中的表。例如,当表需要区时,数据库将查询数据字典表,并搜索空闲区。如果数据库找到空间,则会修改一个数据字典表,然后向另一个数据字典表中插入一行。通过这种方式,数据库通过修改和移动数据来管理空间。
数据库在后台执行以获取数据库对象空间的 SQL 是递归 SQL 。频繁使用递归 SQL 可能会对性能产生负面影响,因为必须对数据字典的更新进行序列化。本地管理的表空间(默认表空间)可避免此性能问题。
另请参阅:Oracle AI Database Administrator’s Guide,了解如何将表空间从字典管理迁移到本地管理
数据块概览
Oracle AI Database 在称为数据块的单元(也称为 Oracle 块或页)中管理数据库数据文件中的逻辑存储空间。数据块是数据库 I/O 的最小单元。
-
数据块和操作系统块 在物理级别,数据库的数据存储在操作系统块组成的磁盘文件中。
-
数据块格式 每个数据块都有一个格式或内部结构,使数据库能够跟踪数据并释放块中的空间。无论数据块包含表、索引还是表集群数据,此格式都是相似的。
-
数据块压缩 数据库可以使用表压缩来消除数据块中的重复值。本节介绍使用压缩的数据块的格式。
-
数据块中的空间管理数据库自下而上填充数据块时,行数据与块标头之间的空闲空间量会减少。
-
索引块概述 索引块是一种特殊类型的数据块,用于以不同于表块的方式管理空间。Oracle AI Database 使用索引块管理索引中的逻辑存储空间。
数据块和操作系统块
在物理级别,数据库的数据存储在由操作系统块组成的磁盘文件中。
操作系统块是操作系统可以读取或写入的最小数据单元。而 Oracle 块是操作系统无法识别其具体大小和结构的逻辑存储结构。
下图显示了操作系统块的大小可能与数据块不同。数据库以多个数据块(而不是操作系统块)请求数据。
图 6:数据块和操作系统块

当数据库请求数据块时,操作系统会将此操作转换为永久存储中的数据请求。数据块与操作系统块的逻辑分离具有以下含义:
-
应用程序不需要确定磁盘上数据的物理地址。
-
可以在多个物理磁盘上条带化或镜像数据库数据。
-
数据库块大小 每个数据库都有一个数据库块大小。
-
表空间块大小 您可以创建块大小不同于
DB_BLOCK_SIZE设置的各个表空间。
数据库块大小
每个数据库都有一个数据库块大小。
DB_BLOCK_SIZE 初始化参数在创建数据库时设置数据库的数据块大小。大小是为 SYSTEM 和 SYSAUX 表空间设置的,是所有其他表空间的默认值。除了通过重新创建数据库外,无法更改数据库块大小。
如果未设置 DB_BLOCK_SIZE,则缺省数据块大小特定于操作系统。数据库的标准数据块大小为 4 KB 或 8 KB。如果数据块和操作系统块的大小不同,则数据块大小必须是操作系统块大小的倍数。
另请参见:
-
Oracle AI Database Reference,了解
DB_BLOCK_SIZE初始化参数 -
Oracle AI Database Administrator’s Guide 和 Oracle AI Database Performance Tuning Guide,了解如何选择块大小
表空间块大小
可以创建块大小不同于 DB_BLOCK_SIZE 设置的单个表空间。
将可传输表空间移动到其他平台时,非标准块大小非常有用。
另请参阅:Oracle AI Database Administrator’s Guide,了解如何为表空间指定非标准块大小
数据块格式
每个数据块都有一个格式或内部结构,使数据库能够跟踪数据并释放块中的空间。无论数据块包含表、索引还是表集群数据,此格式都是相似的。
下图显示了未压缩数据块的格式。
图 7:数据块格式

-
数据块开销 Oracle AI Database 使用块开销来管理块本身。块开销不可用于存储用户数据。
-
行格式 块的行数据部分包含实际数据,例如表行或索引键条目。正如每个数据块都具有内部格式一样,每一行都具有一个行格式,使数据库能够跟踪行中的数据。另请参阅:“数据块压缩”了解压缩块
数据块开销
Oracle AI Database 使用块开销来管理块本身。块开销不可用于存储用户数据。
如“数据块格式”中所示,块开销包括以下部分:
-
块标头
此部分包含有关块的一般信息,包括磁盘地址和段类型。对于事务处理管理的块,块标头包含活动事务处理和历史事务处理信息。
更新块的每个事务处理都需要事务处理条目。Oracle AI Database 最初在块标头中为事务处理条目保留空间。在分配给支持事务处理更改的段的数据块中,空闲空间还可以在空头空间耗尽时保存事务处理条目。事务处理条目所需的空间取决于操作系统。但是,大多数操作系统中的事务条目需要大约 23 个字节。
-
表目录
对于 heap-organized table(按堆组织的表),此目录包含有关其行存储在此块中的表的元数据。在表集群中,多个表可以将行存储在同一个块中。
-
行目录
对于按堆组织的表,此目录描述行在块的数据部分中的位置。数据库可以将一行放置在块底部的任意位置。行地址记录在行目录向量的其中一个插槽中。
行 ID 指向特定文件、块和行号。例如,在行标识
AAAPecAAFAAAABSAAA中,最终AAA表示行号。行号是行目录中某个条目的索引。行目录条目包含指向数据块上行位置的指针。如果数据库移动块中的行,则数据库将更新行目录条目以修改指针。rowid 保持不变。数据库在行目录中分配空间后,数据库在删除行后不会回收此空间。因此,当前为空但以前最多有 50 行的块将继续为行目录分配 100 字节。仅当会话在块中插入新行时,数据库才会重用此空间。
块开销的某些部分的大小是固定的,但总大小是可变的。平均而言,块开销总计为 84 到 107 字节。
行格式
块的行数据部分包含实际数据,例如表行或索引键条目。正如每个数据块都有一个内部格式一样,每一行都有一个行格式,使数据库能够跟踪该行中的数据。
Oracle AI Database 将行存储为可变长度记录。一行包含在一个或多个区段中。每个部分都称为行段。每个行片段都有一个行标题和列数据。
下图显示了行的格式。
图 8:行件的格式

-
行标题 Oracle AI Database 使用行标题管理存储在块中的行片段。
-
列数据 在行标题之后,列数据部分将实际数据存储在行中。行片段通常按
CREATE TABLE语句中列出的顺序存储列,但不能保证此顺序。例如,最后创建类型为LONG的列。 -
行 ID 格式 Oracle AI Database 使用行 ID 唯一标识行。在内部,rowid 是存储数据库访问行所需的信息的结构。行 ID 不是以物理方式存储在数据库中,而是从存储数据的文件和块中推断出来。
行标题
Oracle AI Database 使用行标题管理存储在块中的行片段。
行标题包含如下信息:
-
行段中的列
-
位于其他数据块中的行的片段
如果可以将整个行插入到单个数据块中,则 Oracle AI Database 会将该行存储为一行。但是,如果无法将所有行数据插入到单个块中,或者更新导致现有行超出其块,则数据库会将该行存储在多个行块中。数据块通常每行只包含一行。
-
表集群的集群密钥
一个块中完全包含的行至少有 3 个字节的行标题。
列数据
在行标题之后,列数据部分将实际数据存储在行中。行片段通常按 CREATE TABLE 语句中列出的顺序存储列,但不能保证此顺序。例如,最后创建类型为 LONG 的列。
如“行格式”中的图中所示,对于行片段中的每一列,Oracle AI Database 分别存储列长度和数据。所需的空间取决于数据类型。如果列的数据类型为可变长度,则存储值所需的空间会随着数据的更新而增大和缩小。
每一行在数据块标题的行目录中都有一个插槽。插槽指向行的开头。
行 ID 格式
Oracle AI Database 使用行 ID 唯一标识行。在内部,rowid 是存储数据库访问行所需的信息的结构。行 ID 不是以物理方式存储在数据库中,而是从存储数据的文件和块中推断出来。
扩展行 ID 包括数据对象编号。此行 ID 类型对每行使用基本 64 编码的物理地址。编码字符为 A-Z、a-z、0-9、+ 和 /。
示例 15-1 ROWID 伪列
以下示例查询 ROWID pseudocolumn ,以显示员工 100 的 employees 表中行的扩展行 ID:
SQL> SELECT ROWID FROM employees WHERE employee_id = 100;
ROWID
------------------
AAAPecAAFAAAABSAAA
下图说明了扩展 rowid 的格式。
图 9:ROWID 格式

扩展 rowid 以四件式格式 OOOOOOFFFBBBBBBRRR 显示,格式分为以下部分:
-
OOOOOO数据对象编号标识段(示例查询中的数据对象
AAAPec)。数据对象编号会分配给每个数据库段。同一段中的方案对象(如表群集)具有相同的数据对象编号。 -
FFF表空间相关数据文件编号标识包含该行的数据文件(示例查询中的文件
AAF)。 -
BBBBBB数据块编号标识包含行的块(示例查询中的块
AAAABS)。块编号相对于其数据文件,而非表空间。因此,具有相同块编号的两行可以位于同一表空间的不同数据文件中。 -
RRR行号标识块中的行(示例查询中的行
AAA)。
将 rowid 分配给行片段后,rowid 会在特殊情况下发生更改。例如,如果启用了行移动,则由于分区键更新、闪回表操作、收缩表操作等原因,行 ID 可以更改。如果禁用行移动,则使用 Oracle AI Database 实用程序导出和导入行时,行 ID 可以更改。注:在内部,数据库执行行移动,就像实际删除并重新插入行一样。但是,行移动被视为更新,这会影响触发器。
另请参见:
数据块压缩
数据库可以使用表压缩来消除数据块中的重复值。本节介绍使用压缩的数据块的格式。
使用基本表和高级行压缩的数据块的格式与未压缩块的格式基本相同。不同之处在于,位于块开头的符号表存储了行和列的重复值。数据库使用对符号表的简短引用替换这些值的匹配项。
示例 15-2 压缩数据块的格式
假设以下行存储在七列 sales 表的数据块中:
2190,13770,25-NOV-00,S,9999,23,161
2225,15720,28-NOV-00,S,9999,25,1450
34005,120760,29-NOV-00,P,9999,44,2376
9425,4750,29-NOV-00,I,9999,11,979
1675,46750,29-NOV-00,S,9999,19,1121
对此表应用基本表或高级行压缩时,数据库会用符号引用替换重复值。The following conceptual representation of the compression shows the symbol * replacing 29-NOV-00 and % replacing 9999:
2190,13770,25-NOV-00,S,%,23,161
2225,15720,28-NOV-00,S,%,25,1450
34005,120760,*,P,%,44,2376
9425,4750,*,I,%,11,979
1675,46750,*,S,%,19,1121
表 15-1 概念上表示将符号映射到值的符号表。
表 1 符号表
| 符号 | 值 | 列 | 行 |
|---|---|---|---|
| * | 29-NOV-00 | 3 | 958-960 |
| % | 9999 | 5 | 956-960 |
另请参见:“表压缩”
数据块中的空间管理
当数据库自下而上填充数据块时,行数据与块标头之间的空闲空间量会减少。
在更新期间,数据块中的空闲空间也会缩小,就像将尾随空值更改为非空值时一样。数据库管理数据块中的空闲空间,以优化性能并避免浪费空间。
注:本节假定使用自动段空间管理。
-
数据块中的空闲空间百分比
PCTFREESQL 参数设置保留为可用空间以更新现有行的数据块的最小百分比。PCTFREE对于防止行迁移和避免浪费空间非常重要。 -
优化数据块中的可用空间 虽然可用空间百分比不能小于
PCTFREE,但可用空间量可以大于。例如,将PCTFREE设置为 20% 会阻止空闲空间的总量下降到块的 5%,但允许 50% 的块是空闲的。 -
链接行和迁移行 Oracle AI Database 使用链接和迁移来管理过大而无法放入单个块的行。
数据块中的空闲空间百分比
PCTFREE SQL 参数将保留的数据块的最小百分比设置为用于更新现有行的可用空间。PCTFREE 对于防止行迁移和避免浪费空间非常重要。
例如,假定您创建的表仅需要偶尔更新,其中大多数不会增加现有数据的大小。可以在 CREATE TABLE 语句中指定 PCTFREE 参数,如下所示:
CREATE TABLE test_table (n NUMBER) PCTFREE 20;
图 15-10 显示了 20 的 PCTFREE 设置如何影响空间管理。数据库会随着时间的推移向块中添加行,从而导致行数据向上增长到块标题,该标题本身也向下扩展到行数据。PCTFREE 设置可确保至少 20% 的数据块是免费的。例如,数据库会阻止 INSERT 语句填充块,以便行数据和标头占用总块空间的 90%,仅保留 10% 的空闲空间。
图 10:PCTFREE

注:此讨论不适用于不使用 PCTFREE 存储参数或空闲列表的 LOB 数据类型。
另请参见:
优化数据块中的空闲空间
虽然空闲空间百分比不能小于 PCTFREE,但空闲空间量可以大于。例如,将 PCTFREE 设置为 20% 会阻止空闲空间的总量下降到块的 5%,但允许 50% 的块是空闲的。
-
通过增加空闲空间优化某些 DML 语句可以增加数据块中的空闲空间。
-
Optimization by Coalescing Fragmented Space(通过合并碎片空间来优化)释放的空间可能与数据块中空闲空间的主区域相邻,也可能不相邻。非连续空闲空间称为分段空间。
通过增加空闲空间进行优化
某些 DML 语句可以增加数据块中的空闲空间。
以下语句可以增加空间:
-
DELETE语句 -
UPDATE语句,用于将现有值更新为较小值或增加现有值并强制迁移行 -
对使用高级行压缩的表执行
INSERT语句如果
INSERT语句使用数据填充块,则数据库将调用块压缩,这可能会导致块具有更多空闲空间。
释放的空间可用于 INSERT 语句,条件如下:
-
如果
INSERT语句位于同一事务处理中,并且该语句位于释放空间的语句之后,则该语句可以使用该空间。 -
如果
INSERT语句位于与释放空间(可能由其他用户运行)的语句不同的事务处理中,并且需要空间,则该语句可以使用可用的空间,但只能在其他事务处理提交后使用。
另请参阅:Oracle AI Database Administrator’s Guide 以了解高级行压缩
通过合并碎片化空间进行优化
释放的空间可能与数据块中空闲空间的主区域相邻,也可能不相邻。非连续空闲空间称为分段空间。
下图显示了具有非连续空闲空间的数据块。
图 11:具有碎片空间的数据块

只有满足以下条件时,Oracle AI Database 才会自动透明地合并数据块的空闲空间:
-
INSERT或UPDATE语句尝试使用包含有足够空闲空间以包含新行片段的块。 -
空闲空间已成为碎片,以致于行片段无法插入到块的相邻部分。
合并后,空闲空间的量与操作之前的量相同,但空间现在是连续的。图 15-12 显示了空间合并后的数据块。
图 12:合并空闲空间后的数据块

Oracle AI Database 仅在前面的情况下执行合并,因为否则,由于数据块中空闲空间的持续合并,性能会降低。
链接的行和移植的行
Oracle AI Database 使用链接和迁移来管理过大而无法放入单个块的行。注:标准表中的链接行与区块链表中的行链不同。Oracle AI Database 使用不同的技术来管理区块链表中的行。
可能会出现以下情况:
-
第一次插入时该行太大,无法放入一个数据块。
在行链接中,Oracle AI Database 将行的数据存储在为段保留的一个或多个数据块的链中。行链接通常发生在较大的行上。示例包括包含数据类型为
LONG或LONG RAW的列或具有大量列的行。在这种情况下,行链接不可避免。 -
最初适合于一个数据块的行将更新,以便增加总行长度,但是没有足够的空闲空间来容纳更新的行。
在行迁移中,Oracle AI Database 会将整个行移至新数据块,前提是该行可以放入新块中。已迁移行的原始行片段包含指向包含已迁移行的新块的指针或“转发地址”。已迁移行的行 ID 不会更改。
-
一行包含超过 255 列。
Oracle AI Database 在一个行段中只能存储 255 列。因此,如果将一行插入包含 1000 列的表,则数据库将创建 4 行片段,这些行片段通常会链接在多个块上。
图 15-13 描述在数据块中插入大行的情况。行对于左侧块来说太大,因此数据库通过将第一行片段放置在左侧块中,将第二行片段放置在右侧块中来连锁行。
图 13:行链接

图 15-14 :左侧块包含已更新的行,因此该行现在对块太大。数据库将整个行移至右侧块,并在左侧块中留下指向已迁移行的指针。
图 14:行迁移

链接或迁移行时,检索数据所需的 I/O 会增加。出现这种情况是因为 Oracle AI Database 必须扫描多个块才能检索行的信息。例如,如果数据库执行一个 I/O 读取索引,执行一个 I/O 读取非迁移表行,则需要额外的 I/O 才能获取迁移行的数据。
Segment Advisor 可以手动和自动运行,它是一个 Oracle AI Database 组件,用于标识具有回收空间的段。指导可以提供有关具有大量空闲空间或链接行过多的对象的建议。
另请参见:
-
" Row Storage " 和 " Rowids of Row Pieces "
-
“区块链表概述”
-
Oracle AI Database Administrator’s Guide,了解如何回收浪费的空间
-
Oracle AI Database Performance Tuning Guide,了解如何减少链接行和迁移行
索引块概览
index block 是一种特殊类型的数据块,用于以不同于表块的方式管理空间。Oracle AI Database 使用索引块管理索引中的逻辑存储空间。
-
索引块的类型 索引包含根块、分支块和叶块。
-
索引条目的存储 索引条目的存储方式与数据块中的表行相同。块部分中的索引条目的存储顺序不是二进制,而是堆。
-
重用索引块中的插槽 数据库可以重用索引块中的空间。
-
合并索引块索引合并现有索引数据,如果重组释放块,则将空闲块保留在索引结构中。因此,合并不会释放用于其他用途的索引块,也不会导致索引重新分配块。
索引块的类型
索引包含根块、分支块和叶块。
块类型定义如下:
-
根数据块
此块标识索引的入口点。
-
分支块
搜索索引键时,数据库将在分支块中导航。
-
叶块数
这些块包含指向关联行的索引键值行 ID。叶块按排序顺序存储键值,以便数据库可以高效地搜索某个键值范围中的所有行。
索引条目的存储
索引条目以与数据块中的表行相同的方式存储在索引块中块部分中的索引条目不是以二进制顺序存储的,而是以堆形式存储的。
数据库以不同于数据块中的目录的方式管理索引块中的行目录。行目录中的条目(而不是索引块正文中的条目)按键值排序。例如,在行目录中,索引键 000000 的目录条目位于索引键 111111 的目录条目之前,依此类推。
行目录中条目的排序可提高索引扫描的效率。在范围扫描中,数据库必须读取该范围内指定的所有索引键。数据库将遍历分支块以标识包含第一个密钥的叶块。由于对行目录中的条目进行了排序,因此数据库可以使用二进制搜索来查找范围中的第一个索引键,然后按顺序遍历行目录中的条目,直到找到最后一个键。通过这种方式,数据库可以避免读取叶块主体中的所有密钥。
另请参阅:“数据块开销”
重用索引块中的插槽
数据库可以重用索引块中的空间。
例如,应用程序可能会在列中插入一个值,然后删除该值。当行需要空间时,数据库可以重用以前被删除值占用的索引插槽。
索引块通常具有比按堆组织的表块更多的行。通过将多个行存储在单个索引块中,数据库可以更轻松地维护索引,因为它可以避免频繁拆分块来存储新数据。
虽然可以使用带有 REBUILD 或 COALESCE 选项的 ALTER INDEX 语句手动合并索引,但索引本身无法合并。例如,如果将值 1 填充到 500000 的列,然后删除包含偶数的行,则索引将包含 250,000 个空插槽。仅当数据库可以将适合于包含空插槽的索引块的数据插入时,才重用插槽。
合并指数块
索引合并将现有索引数据压缩到位,如果重组释放块,则将空闲块保留在索引结构中。因此,合并不会释放用于其他用途的索引块,也不会导致索引重新分配块。
Oracle AI Database 不会自动压缩索引:您必须运行带有 REBUILD 或 COALESCE 选项的 ALTER INDEX 语句。图 15-15 显示了合并索引之前 employees.department_id 列的索引。前三个叶块仅部分满,如灰色填充线所示。
图 15:合并前的索引

图 15-16 显示了合并索引后的图 15-15 中的索引。前两个叶块现在已满,如灰色的填充线所示,第三个叶块已释放。
图 16:合并后的指数

另请参见:
-
Oracle AI Database Administrator’s Guide,了解如何合并和重建索引
-
Oracle AI Database SQL Language Reference,了解
COALESCE语句
区概览
区是由逻辑上连续的数据块组成的数据库存储单元。由于实施 RAID 条带和文件系统,区中的数据块可以物理分散在磁盘中。
-
区分配默认情况下,创建数据段时,数据库将为该段分配初始区。区始终包含在一个数据文件中。
-
取消区分配通常,除非使用
DROP语句删除对象,否则用户段的区不会返回到表空间。 -
区的存储参数每个段都由以区表示的存储参数定义。这些参数控制 Oracle AI Database 如何为段分配空闲空间。
区分配
默认情况下,创建数据段时,数据库将为该段分配初始区。区始终包含在一个数据文件中。
虽然尚未向段添加数据,但初始区中的数据块仅保留给此段。每个段的第一个数据块均包含该段中各区的目录。图 15-17 显示了以前未包含数据的数据文件中的段中的初始区。
图 17:段的初始区

如果初始区已满,并且需要更多空间,则数据库会自动为此段分配增量区。增量区是为段创建的后续区。
分配算法取决于表空间是本地管理还是字典管理。在本地管理的案例中,数据库会搜索数据文件的位图以查找相邻的空闲块。如果数据文件空间不足,则数据库会查找另一个数据文件。段的区始终位于同一表空间中,但可能位于不同的数据文件中。图 15-18 显示,数据库可以为表空间中任何数据文件中的段分配区。例如,段可以在 users01.dbf 中分配初始区,在 users02.dbf 中分配第一个增量区,然后在 users01.dbf 中分配下一个区。
图 18:段的增量区

新分配的区块(虽然是空闲的)可能不为空的旧数据。在 ASSM 中,当新分配的区开始使用区时,Oracle AI Database 会对区块进行格式化,但仅根据需要进行格式化。注:本节适用于串行操作,在该操作中,一个服务器进程解析并运行语句。数据库在并行 SQL 语句中以不同的方式分配区,这需要多个服务器进程。
另请参见:
-
Oracle AI Database Administrator’s Guide,了解如何手动分配区
区取消分配
通常,除非使用 DROP 语句删除对象,否则用户段的各个区不会返回到表空间。
例如,如果删除表中的所有行,则数据库不会回收数据块以供表空间中的其他对象使用。还可以使用 DBMS_SPACE_ADMIN 程序包删除段。
注:在还原段中,如果指定了 OPTIMAL 大小或者数据库处于自动还原管理模式,则 Oracle AI Database 会定期取消分配一个或多个区。
在某些情况下,您可以手动取消分配空间。Oracle 段指导可帮助根据对象中的碎片级别确定对象是否具有可供回收的空间。以下技术可以释放区:
-
使用联机段收缩回收段中的碎片空间。段收缩是就地联机操作。通常,数据压缩可提高高速缓存利用率,并且需要更少的块才能在全表扫描中读取。
-
将未分区表或表分区的数据移到新段中,并可选择地移到您具有配额的其他表空间中。
-
重新构建或合并索引。
-
截断表或表集群,这将删除所有行。默认情况下,Oracle AI Database 将取消分配已删除行使用的所有空间,但
MINEXTENTS存储参数指定的空间除外。从 Oracle Database 11g 发行版 2 (11.2.0.2) 开始,您还可以使用带有DROP ALL STORAGE选项的TRUNCATE删除整个段。 -
取消分配未使用的空间,这将释放数据库段高水位标记末尾的未使用空间,并使该空间可用于表空间中的其他段。
释放区时,Oracle AI Database 会修改本地管理的表空间的数据文件中的位图,以将重新获取的区反映为可用空间。释放区块中的任何数据将无法访问。
另请参见:
-
“合并指数块”
-
“还原表空间”
-
Oracle AI Database Administrator’s Guide,了解如何回收段空间
区的存储参数
每个段都由以区表示的存储参数定义。这些参数控制 Oracle AI Database 如何为段分配空闲空间。
存储设置按以下优先级顺序确定,列表覆盖设置中的设置越高,列表中的设置越低:
-
段存储子
-
表空间存储子句
-
Oracle AI Database 默认值
本地管理的表空间可以具有统一的区大小或由系统自动确定的可变区大小:
-
对于统一区,可以指定区的大小或使用 1 MB 的默认大小。表空间中的所有区都具有此大小。本地管理的临时表空间只能使用此类型的分配。
-
对于自动分配的区,Oracle AI Database 将确定其他区的最佳大小。
对于本地管理的表空间,无法在表空间级别指定某些存储参数。但是,您可以在段级别指定这些参数。在这种情况下,数据库会同时使用所有参数来计算段的初始大小。内部算法确定每个区的后续大小。
另请参见:
-
Oracle AI Database Administrator’s Guide,了解创建本地管理的表空间时区管理的注意事项
-
Oracle AI Database SQL Language Reference,了解存储子句中的选项
段概览
段是包含表空间内某个逻辑存储结构的所有数据的一组区。
例如,Oracle AI Database 会分配一个或多个区来构成表的数据段。数据库还会分配一个或多个区来构成表上索引的索引段。
Oracle AI Database 可自动或手动管理段空间。本节假定使用 ASSM。
-
用户段数据库中的单个数据段存储一个用户对象的数据。
-
临时段在处理查询时,Oracle AI Database 通常需要临时工作区来执行 SQL 语句的中间阶段。
-
撤消段 Oracle AI Database 维护事务处理操作的记录,统称为撤消数据。
-
Segment Space and the High Water Mark 为了管理空间,Oracle AI Database 跟踪段中块的状态。高水位标记 (high water mark,HWM) 是段中未设置数据块格式且从未使用的点。另请参见:“逻辑空间管理”以了解有关 ASSM 的更多信息
用户段
数据库中的单个数据段存储一个用户对象的数据。
有不同类型的段。用户段的示例包括:
-
表、表分区或表群集
-
LOB 或 LOB 分区
-
索引或索引分区
每个未分区的对象和对象分区都存储在自己的段中。例如,如果索引有五个分区,则五个段包含索引数据。
- 用户段创建默认情况下,数据库使用延迟段创建在创建表、索引和分区时仅更新数据库元数据。
用户段创建
默认情况下,数据库使用延迟段创建在创建表、索引和分区时仅更新数据库元数据。
当用户将第一行插入到表或分区中时,数据库会为表或分区创建段、其 LOB 列及其索引。延迟段创建可避免不必要地使用数据库资源。例如,一个应用程序的安装可以创建数千个对象,消耗大量的磁盘空间。这些对象中的许多可能永远不会被使用。
DBMS_SPACE_ADMIN 软件包管理空对象的段。可以使用此 PL/SQL 程序包执行以下操作:
-
为未创建段的空表或分区手动实体化段
-
从当前分配了空段的空表或分区中删除段
为了更好地说明对象创建和段创建之间的关系,假设已禁用延迟段创建。创建表的方式如下:
CREATE TABLE test_table (my_column NUMBER);
如图 15-19 中所示,数据库为该表创建一个段。
图 19:创建用户段

使用主键或唯一键创建表时,Oracle AI Database 会自动为此键创建索引。再次假定已禁用延迟段创建。创建表时,如下所示:
CREATE TABLE lob_table (my_column NUMBER PRIMARY KEY, clob_column CLOB);
图 15-20 显示 lob_table 的数据存储在一个段中,而隐式创建的索引存储在另一个段中。此外,CLOB 数据存储在自己的段中,其关联的 CLOB 索引也是如此。因此,CREATE TABLE 语句将创建 four 个不同的段。
图 20:多个段

注:表的段和此表的索引不必占用相同的表空间。
创建段时,数据库将分配一个或多个区。对象的存储参数确定如何分配每个段的区。这些参数会影响与对象关联的数据段的数据检索和存储效率。
另请参见:
-
Oracle AI Database SecureFiles and Large Objects Developer’s Guide(了解内部 LOB)
-
“区的存储参数”
-
Oracle AI Database Administrator’s Guide,了解如何管理延迟段创建
-
Oracle AI Database SQL Language Reference(适用于
CREATE TABLE语法)
临时段
在处理查询时,Oracle AI Database 通常需要临时工作区来执行 SQL 语句的中间阶段。
可能需要临时段的典型操作包括排序、散列和合并位图。在创建索引时,Oracle AI Database 还会将索引段放置到临时段中,然后在索引完成时将索引段转换为永久段。
如果可以在内存中执行操作,则 Oracle AI Database 不会创建临时段。但是,如果无法使用内存,则数据库会自动在磁盘上分配一个临时段。
-
为查询分配临时段 Oracle AI Database 可在用户会话期间根据需要为查询分配临时段,并在查询完成时将其删除。联机重做日志中不会记录对临时段所做的更改,但临时段上的空间管理操作除外。
-
为临时表和索引分配段 Oracle AI Database 可以为临时表及其索引分配临时段。
为查询分配临时段
Oracle AI Database 在用户会话期间根据需要为查询分配临时段,并在查询完成时将其删除。联机重做日志中不会记录对临时段所做的更改,但临时段上的空间管理操作除外。
数据库会在分配给用户的临时表空间中创建临时段。表空间的默认存储特征决定了临时段中各区的特征。由于临时段的分配和取消分配频繁,因此最佳做法是为临时段创建至少一个特殊表空间。数据库在磁盘之间分配 I/O,并避免将 SYSTEM 和具有临时段的其他表空间碎片化。
注:在本地管理 SYSTEM 时,必须在创建数据库时定义默认临时表空间。本地管理的 SYSTEM 表空间不能用于默认临时存储。
另请参见:
-
“联机重做日志概述”
-
Oracle AI Database Administrator’s Guide,了解如何创建临时表空间
-
Oracle AI Database SQL Language Reference(了解
CREATE TEMPORARY TABLESPACE语法和语义)
临时表和索引的段分配
Oracle AI Database 可以为临时表及其索引分配临时段。
临时表存储仅在事务处理或对话期间存在的数据。每个会话仅访问为自身分配的区,并且无法访问为其他会话分配的区。
发生表中的第一个 INSERT 时,Oracle AI Database 会为全局临时表分配段,并且仅在需要时为专用临时表分配段。可以显式执行插入,也可以因为 CREATE TABLE AS SELECT。数据库为表及其索引分配段,为索引创建根页,并分配任何 LOB 段。
当前用户的临时表空间为临时表分配段。例如,分配给 user1 的临时表空间为 temp1,分配给 user2 的临时表空间为 temp2。在这种情况下,user1 将临时数据存储在 temp1 段中,而 user2 将临时数据存储在 temp2 段中。
另请参见:
-
“临时表概览”
-
Oracle AI Database Administrator’s Guide,了解如何创建临时表
撤消段
Oracle AI Database 会维护事务处理操作的记录,统称为撤消数据。
Oracle AI Database 使用还原数据执行以下操作:
Oracle AI Database 将还原数据存储在数据库中,而不是存储在外部日志中。还原数据存储在像数据块一样更新的块中,对这些块的更改将生成重做记录。通过这种方式,Oracle AI Database 可以高效访问还原数据,而无需读取外部日志。
永久对象的还原数据存储在还原表空间中。Oracle AI Database 提供了一种全自动机制(称为自动还原管理模式),用于管理还原表空间中的还原段和空间。
数据库将还原数据分成两个流。临时还原流仅封装由对临时对象所做的更改生成的还原记录,而永久还原流仅封装永久对象的还原记录。数据库独立管理临时和永久还原。撤消分离通过执行以下操作来减少存储并提高性能:
-
使您能够配置最适合永久和临时表的工作负载的永久和还原表空间大小
-
减少写入联机重做日志的重做大小
-
避免备份临时还原数据
在 Active Data Guard 实例上,全局临时表上的 DML 要求在临时还原段中生成还原。
-
还原段和事务处理事务处理启动时,数据库会将事务处理绑定(分配)到当前还原表空间中的还原段,因此绑定到事务处理表。在极少数情况下,如果数据库实例没有指定的还原表空间,则事务处理将绑定到系统还原段。
-
事务处理回退发出
ROLLBACK语句时,数据库使用还原记录回退未提交的事务处理对数据库所做的更改。 -
临时还原段 临时还原段是仅用于临时还原数据的可选空间管理容器。
另请参见:
-
“使用联机重做日志”
-
“临时还原段”
-
Oracle AI Database Reference,了解
TEMP_UNDO_ENABLED初始化参数
撤消段和事务处理
事务处理启动时,数据库将事务处理绑定(分配)到当前还原表空间中的还原段,因此绑定到事务处理表。在极少数情况下,如果数据库实例没有指定的还原表空间,则事务处理将绑定到系统还原段。
多个活动事务处理可以同时写入到同一还原段或不同的段。例如,事务 T1 和 T2 都可以写入还原段 U1,或者 T1 可以写入 U1,而 T2 则写入还原段 U 2。
从概念上讲,还原段中的区形成环。事务处理将写入一个还原区,然后以循环方式写入环中的下一个区,以此类推。图 15-21 显示了两个事务:T1 和 T2,它们开始在还原段的第三区 (E3) 中写入,并继续在第四区 (E4) 中写入。
图 21:撤消段中已分配区的环形

在任何给定时间,事务都会在还原段(称为事务的当前区)中按顺序只写入一个区。多个活动事务处理可以同时写入到同一当前区或不同的当前区。图 15-21 显示了在 E3 范围内同时写入的事务 T1 和 T2。在还原范围内,数据块仅包含一个事务处理的数据。
当当前还原区填充时,第一个需要空间的事务处理将检查环中下一个分配的区的可用性。如果下一个区不包含来自活动事务处理的数据,则该区将成为当前区。现在,所有需要空间的事务都可以写入新的当前区。在图 15-22 中,当 E4 已满时,T1 和 T2 继续写入 E1,以覆盖 E1 中的非活动还原数据。
图 22:在还原段中循环使用已分配区

如果下一个区确实包含来自活动事务处理的数据,则数据库必须分配一个新区。图 15-23 显示了 T1 和 T2 正在写入 E4 的方案。当 E4 填充时,事务处理无法继续写入 E1,因为 E1 包含活动的还原条目。因此,数据库会为此还原段分配一个新区 (E5)。交易继续写信给 E5。
图 23:为还原段分配新区

另请参阅:Oracle AI Database Administrator’s Guide,了解如何管理还原段
事务处理回退
发出 ROLLBACK 语句时,数据库使用还原记录回退未提交的事务处理对数据库所做的更改。
在恢复期间,数据库会将从联机重做日志应用的任何未提交的更改回退到数据文件。还原记录提供读取一致性,方法是在另一个用户更改数据的同时,为访问数据的用户维护数据之前的映像。
临时还原段
临时还原段是仅用于临时还原数据的可选空间管理容器。
临时表更改的还原记录既特定于会话,也仅对读一致性和事务处理回退有用。在 Oracle Database 12c 之前,数据库始终将这些记录存储在联机重做日志中。由于对临时对象的更改不会记录在联机重做日志中,因此将临时对象的还原写入临时还原段可节省联机重做日志和归档重做日志文件中的空间。数据库不会记录对还原所做的更改或对临时表的更改,从而提高性能。
可以设置 TEMP_UNDO_ENABLED 初始化参数,以便临时表将还原数据存储在临时还原段中。当此参数为 TRUE 时,数据库将从临时表空间分配临时还原段。
另请参见:
-
Oracle AI Database Reference,了解
TEMP_UNDO_ENABLED初始化参数
段空间和高水位标记
要管理空间,Oracle AI Database 将跟踪段中块的状态。高水位标记 (high water mark,HWM) 是段中未设置数据块格式且从未使用的点。
MSSM 使用空闲列表来管理段空间。在创建表时,不会设置段中任何块的格式。会话首次向表中插入行时,数据库将在空闲列表中搜索可用的块。如果数据库找不到可用的块,则它将预设一组块的格式,将其放置在空闲列表中,然后开始将数据插入块。在 MSSM 中,全表扫描读取 HWM 下的所有块。
ASSM 不使用空闲列表,因此必须以不同的方式管理空间。会话首次将数据插入表中时,数据库会格式化单个位图块,而不是像在 MSSM 中一样预格式化一组块。位图跟踪段中块的状态,取代空闲列表。数据库使用位图查找空闲块,然后在向每个块填充数据之前对其进行格式化。ASSM 在块之间展开插入以避免并发问题。
ASSM 段中的每个数据块都处于以下状态之一:
-
在 HWM 上方
这些块未设置格式且从未使用过。
-
在 HWM 下方
这些块处于以下状态之一:
-
已分配,但当前未设置格式且未使用
-
格式化并包含数据
-
格式化且为空,因为数据已删除
-
图 15-24 将 ASSM 段描述为水平的一系列块。在创建表时,HWM 位于左侧段的开头。由于尚未插入任何数据,因此段中的所有块都未设置格式且从不使用。
图 24:创建表的 HWM

假设事务处理将行插入到段中。数据库必须分配一组块来存放行。分配的块低于 HWM。数据库格式化此组中的位图块以保存元数据,但不预设组中剩余块的格式。
在图 15-25 中,将分配 HWM 下面的块,而 HWM 上面的块既不分配也不格式化。发生插入时,数据库可以写入任何具有可用空间的块。低高水位标记(低 HWM)标志着以下点,所有块都已知被格式化,因为它们要么包含数据,要么以前包含数据。
图 25:HWM 和低 HWM

在图 15-26 中,数据库选择 HWM 和低 HWM 之间的块并将其写入。数据库可以轻松地在 HWM 和低 HWM 之间选择任何其他块,或者在低 HWM 以下具有可用空间的任何块。在 Figure 15-26 中,新填充的块的任一侧的块都未设置格式。
图 26:HWM 和低 HWM

低 HWM 在全表扫描中非常重要。由于 HWM 下面的块仅在使用时才进行格式化,因此某些块可以取消格式化,如 Figure 15-26 中所示。因此,数据库会读取位图块来获取低 HWM 的位置。数据库会读取到低 HWM 的所有块,因为已知这些块会进行格式化,然后仅仔细读取低 HWM 和 HWM 之间的格式化块。
假设新事务将行插入表中,但位图指示 HWM 下的空闲空间不足。在图 15-27 中,数据库将 HWM 推进到右侧,并分配一组新的未格式化块。
图 27:推进 HWM 和低 HWM

当 HWM 与低 HWM 之间的块已满时,HWM 将向右移动,低 HWM 将向旧 HWM 的位置移动。随着时间的推移,数据库插入数据时,HWM 继续向右移动,低 HWM 始终紧随其后。除非您手动重新生成、截断或收缩对象,否则 HWM 永远不会撤回。
另请参见:
-
Oracle AI Database Administrator’s Guide,了解如何联机收缩段
-
Oracle AI Database SQL Language Reference(了解
TRUNCATE TABLE语法和语义)
表空间概览
表空间是段的逻辑存储容器。
段是消耗存储空间的数据库对象,例如表和索引。在物理级别,表空间将数据存储在一个或多个数据文件或临时文件中。
-
多租户环境中的表空间在 CDB 中,每个 PDB 和应用程序根都有自己的一组表空间。
-
永久表空间 永久表空间将持久方案对象分组。表空间中对象的段以物理方式存储在数据文件中。
-
临时表空间 临时表空间包含仅在会话持续时间内持续的临时数据。永久方案对象不能位于临时表空间中。temp file 存储临时表空间数据。
-
表空间模式:表空间模式确定表空间的可访问性。
-
表空间文件大小 表空间是大文件表空间或小文件表空间。这些表空间在执行不显式引用数据文件或临时文件的 SQL 语句方面无法区分。
多租户环境中的表空间
在 CDB 中,每个 PDB 和应用程序根都有自己的表空间集。
每个 CDB 根、PDB 和应用程序根必须具有 SYSTEM 和 SYSAUX 表空间。下图显示了典型容器中的表空间。
图 28:表空间

CDB 包含以下内容:
-
一个控制文件
-
一个联机重做日志
-
一个或多个还原表空间
只有具有相应权限且当前容器为 CDB 根的公用用户才能创建还原表空间。在任意给定时间,CDB 处于以下任一还原模式:
-
本地还原模式
在这种情况下,每个 PDB 都有自己的还原表空间。如果 CDB 使用本地还原模式,则数据库会自动在每个 PDB 中创建还原表空间。本地还原具有一些优势,例如可以执行 PDB 的热克隆并快速重新定位 PDB。此外,本地还原还提供隔离级别,并支持更快的断开和时间点恢复操作。
PDB 在其中打开的 Oracle Real Application Clusters (RAC) 群集中的每个节点都需要本地还原表空间。例如,如果将 PDB 从双节点群集移动到四节点群集,并且 PDB 在所有节点中均处于打开状态,则数据库会自动创建其他必需的还原表空间。如果再次移动 PDB,则可以删除冗余还原表空间。
注:默认情况下,Database Configuration Assistant (DBCA) 创建启用了本地还原的新 CDB。
-
共享还原模式
在单实例 CDB 中,仅存在一个活动的还原表空间。对于 Oracle RAC CDB,每个实例都有一个活动的还原表空间。所有还原表空间都在所有容器的数据字典和相关视图中可见。
还原模式适用于整个 CDB,这意味着每个容器都使用共享还原,或者每个容器都使用本地还原。可以在 CDB 中的还原模式之间切换,这需要重新启动数据库。
-
-
每个容器的
SYSTEM和SYSAUX表空间CDB 根、每个应用程序根和每个 PDB 都有自己的
SYSTEM和SYSAUX表空间。每个容器还具有自己的一组数据字典表,这些表描述了容器中的对象。 -
零个或多个用户创建的表空间
在典型用例中,每个 PDB 都有自己的一组非系统表空间。这些表空间包含 PDB 中用户定义的方案和对象的数据。通过在
CREATE PLUGGABLE DATABASE或ALTER PLUGGABLE DATABASE语句中使用STORAGE子句,可以限制 PDB 的数据文件使用的存储量。通过在 PDB 中存储数据字典,可以对其进行移植。可以从 CDB 断开 PDB,然后将其插入其他 CDB。
-
每个容器的一组临时文件
示例 15-3 CDB 处于本地还原模式
此示例显示了具有两个 PDB 的 CDB 的物理存储体系结构的各个方面:hrpdb 和 salespdb。在此示例中,数据库使用本地还原模式,CDB 根、hrpdb 和 salespdb 中也有还原数据文件。
图 29:本地还原模式下 CDB 的物理体系结构

另请参阅:“ CDB 中的数据字典分隔”
永久表空间
永久表空间将持久方案对象分组。表空间中对象的段以物理方式存储在数据文件中。
会为每个数据库用户分配一个默认的永久表空间。非常小的数据库可能仅需要默认的 SYSTEM 和 SYSAUX 表空间。但是,Oracle 建议您至少创建一个表空间来存储用户和应用程序数据。可以使用表空间实现以下目标:
-
控制数据库数据的磁盘空间分配
-
将限额(空间限额或限额)分配给数据库用户
-
使单个表空间联机或脱机,而不会影响整个数据库的可用性
-
执行单个表空间的备份和恢复
-
使用 Oracle Data Pump 实用程序导入或导出应用程序数据
-
创建可移植表空间,以便您从一个数据库复制或移动到另一个数据库,甚至跨平台复制或移动
通过传输表空间来移动数据可能比导出/导入或卸载/加载相同数据快几个数量级,因为传输表空间仅涉及复制数据文件和集成表空间元数据。传输表空间时,还可以移动索引数据。
-
SYSTEM 表空间
SYSTEM表空间是创建数据库时随数据库提供的必要管理表空间。Oracle AI Database 使用SYSTEM管理数据库。 -
SYSAUX 表格空间
SYSAUX表格空间是SYSTEM表格的辅助表空间。 -
还原表空间 还原表空间是为系统管理的还原数据保留的本地管理的表空间。
-
影子表空间 影子表空间是用于影子丢失写入保护的大文件表空间。
另请参见:
-
Oracle AI Database Administrator’s Guide,了解如何传输表空间
-
Oracle AI Database Utilities,了解 Oracle Data Pump
SYSTEM 表空间
SYSTEM 表空间是创建数据库时随数据库提供的必要管理表空间。Oracle AI Database 使用 SYSTEM 管理数据库。
SYSTEM 表空间包含以下信息,这些信息均归 SYS 用户所有:
-
数据词典
-
包含有关数据库的管理信息的表和视图
-
编译的存储对象,例如触发器、过程和程序包
SYSTEM 表空间作为任何其他表空间进行管理,但需要更高级别的权限,并且在某些方面受到限制。例如,无法重命名或删除 SYSTEM 表空间。
默认情况下,Oracle AI Database 会将所有新创建的用户表空间设置为本地管理。在具有本地管理的 SYSTEM 表空间的数据库中,无法创建字典管理的表空间(这些表空间已过时)。但是,如果手动执行 CREATE DATABASE 语句并接受默认值,则 SYSTEM 表空间将由字典管理。可以将现有字典管理的 SYSTEM 表空间迁移到本地管理的格式。注:Oracle 强烈建议您使用 Database Configuration Assistant (DBCA) 创建新数据库,以便默认情况下所有表空间(包括 SYSTEM)都由本地管理。
另请参见:
-
“ Online and Offline Tablespaces ”,了解有关
SYSTEM表空间永久联机条件的信息 -
Oracle AI Database Administrator’s Guide,了解如何创建或迁移到本地管理的
SYSTEM表空间 -
Oracle AI Database SQL Language Reference(了解
CREATE DATABASE语法和语义)
SYSAUX 表空间
SYSAUX 表格空间是 SYSTEM 表格的辅助表空间。
因为这是许多以前需要具有自己的表空间的 Oracle AI Database 功能和产品的默认表空间,因此 SYSAUX 所要求的表空间数,也减少了数据库所需的表空间数。还可减少 SYSTEM 表空间的负载。
数据库创建或升级会自动创建 SYSAUX 表空间。在正常数据库操作期间,数据库不允许删除或重命名 SYSAUX 表空间。如果 SYSAUX 表空间不可用,则核心数据库功能仍可运行。使用 SYSAUX 表空间的数据库功能可能会失败,或者功能有限。
另请参阅:Oracle AI Database Administrator’s Guide 以了解 SYSAUX 表空间
还原表空间
还原表空间是为系统管理的还原数据保留的本地托管表空间。
与其他永久表空间一样,还原表空间包含数据文件。这些文件中的还原块按区分组。
自动还原管理模式
还原表空间要求数据库处于默认自动还原模式。
自动模式可消除手动管理还原段的复杂性。数据库会自动进行优化,以尽可能保留还原数据,从而满足可能需要此数据的长时间运行的查询。
Oracle AI Database 的新安装将自动创建还原表空间。早期版本的 Oracle AI Database 可能不包含还原表空间,而是使用传统回退段(称为手动还原管理模式)。Oracle AI Database 包含一个还原指导,该指导提供有关还原建议并有助于自动执行还原环境。
一个数据库可以包含多个还原表空间,但一次只能使用一个还原表空间。当实例尝试打开数据库时,Oracle AI Database 会自动选择第一个可用的还原表空间。如果没有还原表空间可用,则实例将在不使用还原表空间的情况下启动,并将还原数据存储在 SYSTEM 表空间中。建议不要在 SYSTEM 中存储还原数据。
另请参见:
-
Oracle AI Database Upgrade Guide,了解如何迁移到自动还原管理模式
自动还原保留期
还原保留期是 Oracle AI Database 尝试在覆盖旧还原数据之前保留该数据的最短时间。
还原保留很重要,因为长时间运行的查询可能需要较早的块映像来提供读一致性。此外,某些 Oracle Flashback 功能可能依赖于还原可用性。
一般来说,最好尽可能长时间保留旧的还原数据。提交事务处理后,回退或事务处理恢复不再需要还原数据。如果还原表空间有用于新事务处理的空间,则数据库可以保留旧还原数据。当可用空间不足时,数据库将开始覆盖已提交事务处理的旧还原数据。
Oracle AI Database 可自动为当前还原表空间提供最佳的还原保留期。数据库将收集使用情况统计信息,并根据这些统计信息以及还原表空间大小优化保留期。如果使用 AUTOEXTEND 选项配置了还原表空间,并且未指定最大大小,则还原保留期优化会有所不同。在这种情况下,如果空间允许,数据库会将还原保留期调整为略长于运行时间最长的查询。
另请参阅:Oracle AI Database Administrator’s Guide,了解有关自动优化还原保留期的更多详细信息
影子表空间
影子表空间是用于影子丢失写入保护的大文件表空间。
注:影子丢失写入保护与使用 DB_LOST_WRITE_PROTECT 初始化参数和备用数据库配置的丢失写入保护无关。
-
影子表空间的用途 影子丢失的写入保护可快速检测并立即响应丢失的写入。
-
影子表空间的工作方式:丢失的写入保护需要两个表空间:影子表空间和其块由影子表空间跟踪的非影子表空间。
-
Shadow Tablespaces 用户界面您可以使用
ALTER PLUGGABLE DATABASE命令启用和禁用影子丢失的写保护。 -
示例:配置丢失的写入保护此示例为一组表空间启用影子丢失的写入跟踪。
影子表空间的用途
影子丢失的写入保护可快速检测丢失的写入并立即响应。
当 I/O 子系统确认块写入已完成时,即使未发生写入,或者当块的前映像覆盖当前映像时,也会发生数据块丢失写入。
未检测到的丢失写入可能会导致数据损坏,因为不正确的数据可用于其他 DML 事务处理。例如,一个事务处理可以读取一个表中的旧数据和不正确数据,然后根据这些数据更新数百个其他表。这样,数据损坏就会扩散到整个数据库中。
影子丢失写入保护具有以下优点:
-
它会检测到写入丢失,然后才会将其用于标准 DML、SQL*Loader 常规路径加载、直接路径加载和 RMAN 备份。
-
可以为特定表空间和数据文件启用影子丢失写入保护。您不需要跟踪所有数据。
-
可以将一个影子表空间替换为另一个影子表空间以更改其配置或位置。
-
您可以暂停和恢复表空间或数据文件的影子丢失写保护。
-
可以使用单个
ALTER DATABASE ... LOST WRITE PROTECTION语句为 PDB 启用或禁用它。PROP$表指示是否为 PDB 启用跟踪。
另请参阅:Oracle AI Database SQL Language Reference 以了解有关 LOST WRITE PROTECTION 子句的更多信息
影子表空间的工作方式
丢失的写入保护需要两个表空间:一个影子表空间和一个非影子表空间,其块由影子表空间跟踪。
下图提供了示例方案。表空间 TBS1 和 TBS2 中的数据文件由影子表空间跟踪。影子表空间仅跟踪表空间 TBS3 中的数据文件 DBF6。

一个跟踪的数据文件映射到影子表空间中的一个影子区。跟踪数据文件中的每个数据块在影子块中都有一个对应的条目。此条目包含跟踪数据块的 SCN。从磁盘读取跟踪的数据块时,影子丢失的写入保护会将影子表空间中块的 SCN 与跟踪数据块中最近写入的 SCN 进行比较。如果影子条目的 SCN 大于要读取的数据块,则会发生丢失的写入,并提示出现错误。
影子区的大小具有显著的额外空间,以防止数据文件的自动调整大小导致影子区增大过大。如果跟踪的数据文件是手动或自动调整大小的,并且影子区需要增长,则数据库将尝试调整跟踪数据的大小。如果影子表空间中不存在足够的空间,则数据库会将警告写入预警日志,并跟踪尽可能多的数据块。
另请参阅:Oracle AI Database Administrator’s Guide,了解如何管理影子丢失写入保护
影子表空间的用户界面
可以使用 ALTER PLUGGABLE DATABASE 命令启用和禁用影子丢失写入保护。
要保护特定表空间或数据文件的影子丢失写入保护,必须满足以下条件:
-
必须已使用
ALTER PLUGGABLE DATABASE ENABLE LOST WRITE PROTECTION语句为整个 PDB 启用影子丢失写入保护。注:在 CDB 中,如果在根中启用影子丢失写入保护,则 PDB 不会继承它。必须为要保护的每个 PDB 启用影子丢失写入保护。
-
必须已启用影子丢失写入保护,才能使用
ENABLE LOST WRITE PROTECTION子句保护表空间或数据文件。为表空间启用影子丢失的写入保护时,表空间的所有数据文件都会受到保护,添加到表空间的任何数据文件也会受到保护。请注意,不能对临时表空间或其他丢失的写入表空间启用丢失的写入保护。
-
必须已使用带有
LOST WRITE PROTECTION子句的CREATE BIGFILE TABLESPACE语句创建了一个或多个影子表空间。
Oracle AI Database 会自动将跟踪的数据文件分配给特定的影子表空间。无法指定哪个影子表空间用于特定数据文件。
以下数据字典视图监视影子表空间:
-
DBA_TABLESPACES通过查询显示哪些表空间是影子表空间。
-
DBA_DATA_FILES.LOST_WRITE_PROTECT显示是否为数据文件启用了丢失的写入保护
-
USER_TABLESPACES.LOST_WRITE_PROTECT显示是否为特定表空间启用丢失的写入保护。
DBA_DATA_FILES不指示是否为表空间打开了写入丢失:您必须改为查看USER_TABLESPACES。
另请参见:
-
Oracle AI Database Administrator’s Guide,了解如何使用影子表空间管理丢失的写入保护
-
Oracle AI Database SQL Language Reference,了解
CREATE TABLESPACE语句 -
Oracle AI Database Reference(了解
DBA_TABLESPACES)
示例:配置丢失的写入保护
此示例为一组表空间启用影子丢失写入跟踪。
在此示例中,您的目标是保护 PDB 中的 salestbs 和 hrtbs 表空间。您还希望保护 oetbs01.dbf 数据文件,并且只保护 oetbs 表空间中的此数据文件。您可以执行以下操作:
-
以管理员身份登录到 PDB。
-
按如下方式创建单个影子表空间:
CREATE BIGFILE TABLESPACE shadow_lwp1 DATAFILE 'shadow_lwp1_df' SIZE 10M LOST WRITE PROTECTION; -
为 PDB 启用丢失的写入保护,如下所示:
ALTER DATABASE ENABLE LOST WRITE PROTECTION; -
为
salestbs和hrtbs表空间启用影子丢失写入保护,如下所示:ALTER TABLESPACE salestbs ENABLE LOST WRITE PROTECTION; ALTER TABLESPACE hrtbs ENABLE LOST WRITE PROTECTION; -
为
oetbs01.dbf数据文件启用影子丢失写入保护,如下所示:ALTER DATABASE DATAFILE 'oetbs01.dbf' ENABLE LOST WRITE PROTECTION;
另请参见:
-
Oracle AI Database Administrator’s Guide,了解如何管理影子表空间
-
Oracle AI Database SQL Language Reference,了解
CREATE TABLESPACE语句
临时表空间
临时表空间包含仅在会话期间持续的临时数据。永久方案对象不能位于临时表空间中。temp file 存储临时表空间数据。
临时表空间可以提高内存中不适合的多个排序操作的并发性。这些表空间还可提高排序期间空间管理操作的效率。
-
共享表空间和本地临时表空间 临时表空间是共享表空间或本地表空间。
-
Default Temporary Tablespaces(默认临时表空间)为每个数据库用户帐户分配默认的共享临时表空间。如果数据库包含本地临时表空间,则还会为每个用户帐户分配默认的本地临时存储。
共享和本地临时表空间
临时表空间是共享表空间或本地表空间。
共享临时表空间将临时文件存储在共享磁盘上,以便所有数据库实例都可访问该临时空间。相反,本地临时表空间会为每个数据库实例存储单独的非共享临时文件。本地临时表空间可用于 Oracle Real Application Clusters 或 Oracle Flex Clusters。
可以为只读和读/写数据库实例创建本地临时表空间。当许多只读实例访问单个数据库时,本地临时表空间可以提高涉及排序、散列聚合和联接的查询的性能。优点是:
-
通过使用本地而非共享磁盘存储来提高 I/O 性能
-
避免昂贵的跨实例临时空间管理
-
通过消除磁盘上空间元数据管理来提高实例启动性能
下表比较了共享和本地临时表空间的特征。
表 2:共享和本地临时表空间
| 共享临时表空间 | 本地临时表空间 |
|---|---|
使用 CREATE TEMPORARY TABLESPACE 语句创建。 |
使用 注:本地临时表空间始终是大文件表空间,但创建语句中不需要 |
| 为数据库创建单个临时表空间。 | 为每个数据库实例创建单独的临时表空间。FOR LEAF 选项仅为只读实例创建表空间。FOR ALL 选项为所有实例(只读和读/写)创建表空间。 |
| 支持表空间组。 | 不支持表空间组。 |
| 将临时文件元数据存储在控制文件中。 | 存储控制文件中所有实例通用的临时文件元数据,以及 SGA 中特定于实例的元数据(例如,分配的位图、当前临时文件大小和文件状态)。 |
另请参阅:“Oracle AI Database 实例简介”
默认临时工作区
为每个数据库用户帐户分配一个默认的共享临时表空间。如果数据库包含本地临时表空间,则还会为每个用户帐户分配默认的本地临时存储。
可以使用 CREATE USER 或 ALTER USER 语句为用户帐户指定其他临时表空间。对于未为其指定其他临时表空间的用户,Oracle AI Database 使用系统级默认临时表空间。
-
创建默认临时表空间 创建数据库时,默认临时存储取决于
SYSTEM表空间是否在本地管理。 -
对临时存储的访问如果为用户分配了临时表空间,则数据库将首先访问该表空间;否则,数据库将访问默认临时表空间。数据库访问查询的临时表空间后,不会切换到其他表空间。另请参阅:Oracle AI Database SQL Language Reference 以了解有关
CREATE USER语句的更多信息
创建默认临时表空间
创建数据库时,默认临时存储取决于 SYSTEM 表空间是否在本地管理。
下表显示了 Oracle AI Database 在创建数据库时如何选择默认临时表空间。
表 3:创建默认临时表空间
| SYSTEM 表空间是否在本地管理? | CREATE DATABASE 语句是否指定了默认临时表空间? | 然后,数据库… |
|---|---|---|
| 是 | 是 | 使用指定的表空间作为默认值。 |
| 是 | 否 | 创建临时表空间。 |
| 否 | 是 | 使用指定的表空间作为默认值。 |
| 否 | 否 | 使用 SYSTEM 作为默认临时存储。数据库在预警日志中写入一条警告,指示建议使用默认临时表空间。 |
创建数据库后,可以使用 ALTER DATABASE DEFAULT TEMPORARY TABLESPACE 语句更改数据库的默认临时表空间。注:不能将默认临时表空间设为永久表空间。
另请参见:
-
Oracle AI Database Administrator’s Guide,了解如何创建默认临时表空间
-
Oracle AI Database SQL Language Reference,了解
CREATE DATABASE和ALTER DATABASE的DEFAULT TEMPORARY TABLESPACE子句的语法
访问临时存储
如果为用户分配了临时表空间,则数据库将首先访问该表空间;否则,数据库将访问默认临时表空间。数据库访问查询的临时表空间后,不会切换到其他表空间。
用户查询可以访问共享或本地临时存储。此外,可以为只读实例分配一个默认本地临时表空间,并为读/写实例分配不同的默认本地临时表空间。
对于读/写实例,数据库对共享临时表空间给予更高的优先级。对于只读实例,数据库对本地临时表空间给予更高的优先级。如果数据库实例是读/写实例,则数据库按以下顺序搜索空间:
-
是否为用户分配了共享临时表空间?
-
是否为用户分配了本地临时表空间?
-
数据库默认临时表空间是否具有空间?
如果前面任何问题的答案是肯定的,则数据库将停止搜索并从指定的表空间分配空间;否则,将从数据库默认的本地临时表空间分配空间。
如果数据库实例是只读的,则数据库按以下顺序搜索空间:
-
是否为用户分配了本地临时表空间?
-
分配的数据库默认本地临时表空间是否具有空间?
-
是否为用户分配了共享临时表空间?
如果前面任何问题的答案都是“是”,则数据库将停止搜索并从指定的表空间分配空间;否则,将从数据库默认的共享临时表空间分配空间。
表空间模式
表空间模式确定表空间的可访问性。
-
Read/Write and Read-Only Tablespaces(读/写和只读表空间)每个表空间都处于指定是否可以写入的写入模式。
-
Online and Offline Tablespaces(联机和脱机表空间)每当数据库打开时,表空间都可以联机(可访问)或脱机(不可访问)。
读取/写入和只读表空间
每个表空间都处于指定是否可以写入的写入模式。
互斥模式如下:
-
读取/写入模式
用户可以读取和写入表空间。所有表空间最初都创建为读/写。
SYSTEM和SYSAUX表空间和临时表空间是永久读取/写入的,这意味着它们不能设置为只读。 -
只读模式下
将阻止对表空间中的数据文件执行写入操作。只读表空间可以驻留在只读介质上,例如 DVD 或 WORM 磁带机。
只读表空间无需对数据库的大型静态部分执行备份和恢复。只读表空间不会更改,因此不需要重复备份。如果在介质故障后恢复数据库,则不需要恢复只读表空间。
另请参见:
-
Oracle AI Database Administrator’s Guide,了解如何将表空间更改为只读或读/写模式
-
Oracle AI Database SQL Language Reference(了解
ALTER TABLESPACE语法和语义) -
Oracle AI Database Backup and Recovery User’s Guide(了解有关恢复的更多信息)
联机和离线表空间
表空间可以联机(可访问),也可以脱机(不可访问)。
表空间通常处于联机状态,以便用户可以使用其数据。SYSTEM 表空间和临时表空间无法脱机。
表空间可以自动或手动脱机。例如,您可以使表空间脱机以进行维护或备份和恢复。当遇到某些错误时,数据库会自动使表空间脱机,例如当数据库写进程 (DBW) 进程多次尝试写入数据文件时失败时。尝试访问脱机表空间中的表的用户将收到错误。
当表空间脱机时,数据库执行以下操作:
-
数据库不允许后续 DML 语句引用脱机表空间中的对象。脱机表空间不能由 Oracle AI Database 以外的任何实用程序读取或编辑。
-
具有引用该表空间中数据的已完成语句的活动事务处理在事务处理级别不受影响。
-
数据库将对应于这些已完成语句的还原数据保存在
SYSTEM表空间的延迟还原段中。将表空间联机时,如果需要,数据库会将还原数据应用于表空间。
另请参见:
-
“数据库写进程 (DBW) ”
-
Oracle AI Database Administrator’s Guide,了解如何更改表空间可用性
表空间文件大小
表空间是大文件表空间或小文件表空间。这些表空间在执行不显式引用数据文件或临时文件的 SQL 语句方面无法区分。
不同之处如下:
-
小文件表空间可以包含多个数据文件或临时文件,但文件大小不能与大文件表空间中的大小相同。这是默认表空间类型。
-
大文件表空间包含一个非常大的数据文件或临时文件。此类型的表空间可以执行以下操作:
-
增加数据库的存储容量
数据库中的最大数据文件数受到限制,因此增加每个数据文件的大小会增加整体存储。
-
减轻管理许多数据文件和临时文件的负担
Bigfile 表空间使用 Oracle Managed Files 和 Automatic Storage Management (Oracle ASM) 简化文件管理,无需添加新文件和处理多个文件。
-
对表空间(而不是单个文件)执行操作
大文件表空间使表空间成为磁盘空间管理、备份和恢复等的主要单元。
大文件表空间仅支持使用 ASSM 的本地管理的表空间。但是,本地管理的还原和临时表空间可以是大文件表空间,即使是手动管理的段也是如此。
从 Oracle AI Database 26ai 开始,默认情况下将 SYSTEM、SYSAUX 和 USER 表空间创建为大文件表空间。从以前的发行版升级的数据库保留其表空间类型。
-
另请参见:
-
Oracle AI Database Backup and Recovery User’s Guide(了解有关备份和恢复的更多信息)
-
Oracle AI Database Administrator’s Guide,了解如何管理大文件表空间