数据字典和动态性能视图
每个 Oracle 数据库的只读参考表和视图的中心集统称为数据字典。动态性能视图是在数据库打开和使用期间持续更新的特殊视图。
-
数据字典概览 Oracle 数据库的一个重要部分是数据字典,数据字典是一组只读的表,提供有关数据库的管理元数据。
-
动态性能视图概览 在整个操作过程中,Oracle AI Database 会维护一组记录当前数据库活动的虚拟表。
-
数据库对象元数据
DBMS_METADATA软件包和DBMS_DEVELOPER.GET_METADATA函数提供了用于提取数据库对象的完整定义的接口。
数据字典概览
Oracle 数据库的一个重要部分是其数据字典,这是一组只读表,提供有关数据库的管理元数据。
-
数据字典的用途 数据字典包含描述数据库内容的元数据。
-
数据字典组件 数据字典由基表和视图组成。
-
数据字典的工作原理 Oracle AI Database 用户帐户
SYS拥有数据字典的所有基表和用户可访问的视图。 -
数据字典存储 将 CDB 的元数据作为一个整体存储的数据字典仅存储在系统表空间中。
数据字典的用途
数据字典包含描述数据库内容的元数据。
例如,数据字典包含如下信息:
-
数据库中每个方案对象的定义,包括列的默认值和完整性约束条件信息
-
为方案目标对象分配的空间量,以及方案目标对象当前使用的空间量
-
Oracle AI Database 用户的名称、授予用户的权限和角色以及与用户相关的审计信息
-
数据管理 数据字典是每个 Oracle 数据库的数据管理的中心部分。
-
在 CDB 中分隔数据字典在 CDB 中,数据字典元数据在 CDB 根和 PDB 之间拆分。从用户和应用程序角度看,CDB 中每个容器中的数据字典是分开的。
数据管理
对于每个 Oracle 数据库,数据字典都是数据管理的核心部分。
例如,数据库执行以下操作:
-
访问数据字典以查找有关用户、方案对象和存储结构的信息
-
每次发出 DDL 语句时修改数据字典
由于 Oracle AI Database 像其他数据一样将数据字典数据存储在表中,因此用户可以使用 SQL 查询数据。例如,用户可以运行 SELECT 语句来确定其权限、其方案中存在哪些表、这些表中的哪些列、是否基于这些列构建索引等。
另请参见:
CDB 中的数据字典分隔
在 CDB 中,数据字典元数据在 CDB 根和 PDB 之间进行拆分。从用户和应用程序角度看,CDB 中每个容器中的数据字典是分开的。
在新创建的尚未包含用户数据的 CDB 中,CDB 根中的数据字典仅包含系统元数据。例如,TAB$ 表包含仅描述 Oracle 提供的表的行,例如 TRIGGER$ 和 SERVICE$。下图描述了三个底层数据字典表,红色条表示描述系统的行。
图 1:CDB 根中的数据字典元数据

假设创建 PDB,然后创建包含此 PDB 中 employees 和 departments 表的 hr 方案。PDB 中的数据字典包含一些描述 Oracle 提供的实体的行,以及描述用户创建的实体的其他行。例如,PDB 字典中的 TAB$ 表包含一行 employees 表的元数据,以及一行 departments 表。
图 2:CDB 中的数据字典体系结构

上图显示了 PDB 中的数据字典包含指向 CDB 根中数据字典的指针。在内部,Oracle 提供的对象(例如数据字典表定义和 PL/SQL 程序包)仅在 CDB 根中表示一次。此体系结构在 CDB 中实现了两个主要目标:
-
减少重复
例如,CDB 不在每个 PDB 中存储
DBMS_ADVISORPL/SQL 程序包的源代码,而是在CDB$ROOT中仅存储一次代码,从而节省磁盘空间。 -
易于数据库升级
如果每个 PDB 中都存在数据字典表的定义,并且如果要在新发行版中更改该定义,则需要分别升级每个 PDB 才能捕获更改。将表定义仅存储在 CDB 根中一次可消除此问题。
数据字典组件
数据字典由基表和视图组成。
这些对象的定义如下:
-
基表格
它们存储有关数据库的信息。只有 Oracle AI Database 才能写入和读取这些表。用户很少直接访问基表,因为它们是规范化的,并且大多数数据都以加密格式存储。
-
视图
这些表使用联接和
WHERE子句将基表数据解码成有用的信息(如用户名或表名),以使这些信息简单易懂。视图包含数据字典中所有对象的名称和说明。某些视图可供所有数据库用户访问,而其他视图仅供管理员访问。
通常,数据字典视图按集合分组。在许多情况下,一个集合由包含相似信息的三个视图组成,各个视图通过前缀彼此进行区分,如下表中所示。通过查询适当的视图,您只能访问与您相关的信息。
表 1 数据字典视图集
| 前缀 | 用户权限 | 内容 | 注释 |
|---|---|---|---|
DBA_ |
数据库管理人员 | 全部对象 | 某些 DBA_ 视图具有其他列,其中包含对管理员有用的信息。 |
ALL_ |
所有用户 | 用户具有权限的对象 | 包括用户拥有的对象。这些视图遵循当前启用的角色集。 |
USER_ |
所有用户 | 用户拥有的对象 | 前缀为 USER_ 的视图通常不包括列 OWNER。此列在 USER_ 视图中暗示为发出查询的用户。 |
并非所有视图集都具有三个成员。例如,数据字典包含 DBA_LOCK 视图,但没有 ALL_LOCK 视图。
系统提供的 DICTIONARY 视图包含所有数据字典视图的名称和缩写说明。此视图的以下查询包括部分示例输出:
SQL> SELECT * FROM DICTIONARY
2 ORDER BY TABLE_NAME;
TABLE_NAME COMMENTS
------------------------------ ----------------------------------------
ALL_ALL_TABLES Description of all object and relational
tables accessible to the user
ALL_APPLY Details about each apply process that
dequeues from the queue visible to the
current user
.
.
.
-
CDB 中的容器数据对象 容器数据对象是一个表或视图,其中包含与多个容器或整个 CDB 有关的数据。
-
前缀为 DBA_ 的视图,前缀为
DBA_的视图显示整个数据库中的所有相关信息。DBA_视图仅供管理员使用。 -
前缀为 ALL_ 的视图,前缀为
ALL_的视图指用户对数据库的整体视角。 -
前缀为 USER_ 的视图 典型数据库用户最感兴趣的视图是前缀为
USER_的视图。 -
DUAL 表
DUAL是数据字典中的一个小表,Oracle AI Database 和用户编写的程序可以引用该表来保证已知结果。
另请参见:
-
“视图概述”
-
Oracle AI Database Reference,了解数据字典视图及其列的完整列表
CDB 中的容器数据对象
容器数据对象是一个表或视图,其中包含与多个容器或整个 CDB 有关的数据。
容器数据权限支持一般要求,即多个 PDB 驻留在单个 CDB 中,但具有不同的本地管理要求。例如,如果应用程序 DBA 不想在本地进行管理,则他们可以向公用用户授予对相应视图的容器数据权限。在这种情况下,CDB 管理员可以访问这些 PDB 的数据。相反,不希望 CDB 管理员访问其数据的 PDB 管理员不会授予容器数据权限。
容器数据对象的示例是 Oracle 提供的视图,其名称以 V$ 和 CDB_ 开头。所有容器数据对象都具有 CON_ID 列。下表显示了此列值的含义。
表 2 容器 ID 值
| 容器标识 | 行与 |
|---|---|
0 |
整个 CDB |
1 |
CDB$ROOT |
2 |
PDB$SEED |
| 所有其他 ID | 用户创建的 PDB、应用程序根或应用程序种子 |
在 CDB 中,对于每个 DBA_ 视图,都存在对应的 CDB_ 视图。CDB_ 视图的所有者是相应 DBA_ 视图的所有者。下图显示了不同类别的字典视图之间的关系:
图 3:CDB 中的字典视图

当当前容器为 PDB 时,用户只能查看当前 PDB 的数据字典信息。但是,当当前容器是 CDB 根时,公用用户可以查询 CDB_ 视图来查看 CDB 根的元数据以及此用户有权访问的 PDB 的元数据。注:从 CDB 根查询时,CDB_ 和 V$ 视图会隐式将数据转换为 AL32UTF8 字符集。如果将字符集转换为 AL32UTF8 时需要更多字节来表示字符,并且视图列宽度无法容纳来自特定 PDB 的数据,则可以截断数据。
下表介绍了 CDB_ 视图的查询。每一行描述在前一行中的操作之后发生的操作。
表 3 查询 CDB_ 视图
| 操作 | 说明 |
|---|---|
|
CDB 中所有容器共有的 |
|
SYSTEM 查询 CDB_USERS 以获取 CDB 根中的公用用户数。输出表明 CDB 根中存在 38 个公用用户。 |
|
SYSTEM 查询 CDB_USERS 以确定 CDB 中不同容器的数量。 |
|
SYSTEM 用户现在连接到名为 hrpdb 的 PDB。 |
|
SYSTEM 查询 CDB_USERS。输出表明当前容器中存在 48 个公用用户和本地用户,即 hrpdb。 |
|
SYSTEM 查询 DBA_USERS。输出与上一个查询相同。由于 SYSTEM 未连接到 CDB 根,因此 DBA_USERS 视图显示与 CDB_USERS 相同的输出。由于 DBA_USERS 仅显示 current 容器中的用户,因此显示 48 个。 |
带有前缀 DBA_ 的视图
前缀为 DBA_ 的视图显示整个数据库中的所有相关信息。DBA_ 视图仅供管理员使用。
以下示例查询显示有关数据库中的所有对象的信息:
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
FROM DBA_OBJECTS
ORDER BY OWNER, OBJECT_NAME;
另请参阅:Oracle AI Database Administrator’s Guide,了解有关管理权限的详细信息
带有前缀 ALL_ 的视图
前缀为 ALL_ 的视图指用户对数据库的整体视角。
除了用户拥有的方案对象外,这些视图还返回有关用户可以通过公共或显式授予权限和角色来访问的方案对象的信息。
例如,以下查询将返回有关您有权访问的所有对象的信息:
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
FROM ALL_OBJECTS
ORDER BY OWNER, OBJECT_NAME;
由于 ALL_ 视图遵循当前启用的角色集,因此查询结果取决于启用的角色,如以下示例中所示:
SQL> SET ROLE ALL;
Role set.
SQL> SELECT COUNT(*) FROM ALL_OBJECTS;
COUNT(*)
----------
68295
SQL> SET ROLE NONE;
Role set.
SQL> SELECT COUNT(*) FROM ALL_OBJECTS;
COUNT(*)
----------
53771
应用程序开发人员在存储过程中使用 ALL_ 视图时应了解角色的影响,默认情况下不会启用角色。
带有前缀 USER_ 的视图
典型数据库用户最感兴趣的视图是前缀为 USER_ 的视图。
这些视图:
-
请参阅数据库中的用户专用环境,包括有关用户创建的方案对象的元数据、用户所做的授权等
-
仅显示与用户相关的行,并在
ALL_视图中返回信息的子集 -
列与其他视图相同,只是隐含了列
OWNER -
为方便起见,可以缩写
PUBLIC同义词
例如,以下查询将返回方案中包含的所有对象:
SELECT OBJECT_NAME, OBJECT_TYPE
FROM USER_OBJECTS
ORDER BY OBJECT_NAME;
DUAL 表
DUAL 是数据字典中的一个小表,Oracle AI Database 和用户编写的程序可以引用该表来保证已知结果。
当一个值必须仅返回一次(例如,当前日期和时间)时,dual 表非常有用。所有数据库用户都可以访问 DUAL。
DUAL 表具有一个名为 DUMMY 的列,一个包含值 X 的行。以下示例查询 DUAL 以执行算术运算:
SQL> SELECT ((3*4)+5)/3 FROM DUAL;
((3*4)+5)/3
-----------
5.66666667
另请参阅: Oracle AI Database SQL Language Reference,了解有关 DUAL 表的更多信息
数据字典的工作原理
Oracle AI Database 用户帐户 SYS 拥有所有基表以及用户可访问的数据字典视图。
在数据库操作期间,Oracle AI Database 会读取数据字典,以确定方案对象是否存在以及用户是否具有适当的访问权限。Oracle AI Database 会持续更新数据字典,以反映数据库结构、审计、授权和数据方面的更改。
例如,如果用户 hr 创建了一个名为 interns 的表,则数据库会向数据字典中添加新行,以反映新表、列、段、区以及 hr 对该表具有的权限。下次查询字典视图时,可以看到此新信息。
数据字典的基表中的数据对于 Oracle AI Database 发挥作用是必需的。只有 Oracle AI Database 才应写入或更改数据字典信息。任何 Oracle AI Database 用户都不应更改 SYS 方案中包含任何行或模式对象,因为此类活动会破坏数据完整性。安全管理员必须严格控制此类重要帐户。
警告:更改或处理数据字典表中的数据可能会永久且不利地影响数据库操作。
-
元数据和数据链接 CDB 使用内部链接机制来分隔数据字典信息。
-
数据字典视图的公共同义词 Oracle AI Database 为许多数据字典视图创建公共同义词,以便用户可以方便地访问它们。
-
Data Dictionary Cache Much of the data dictionary information is in the data dictionary cache because the database constantly requires the information to validate user access and verify the state of schema objects.
-
其他程序和数据字典 其他 Oracle AI Database 产品可以引用现有视图并创建其他数据字典表或自己的视图。另请参见:“ SYS 和 SYSTEM 帐户”
元数据和数据链接
CDB 使用内部链接机制来分隔数据字典信息。
具体而言,Oracle AI Database 使用以下自动管理的指针:
-
元数据链接
Oracle AI Database 仅将有关字典对象的元数据存储在 CDB 根中。例如,
OBJ$字典表(作为DBA_OBJECTS数据字典视图的基础)的列定义仅存在于 CDB 根中。如图 9-2 中所述,每个 PDB 中的OBJ$表使用称为元数据链接的内部机制来指向 CDB 根中存储的OBJ$的定义。与元数据链接相对应的数据位于其 PDB 中,而不是 CDB 根中。例如,如果在
hrpdb中创建表mytable并向其添加行,则这些行将存储在 PDB 数据文件中,而不是 CDB 根数据文件中。PDB 和 CDB 根中的数据字典视图包含不同的行。例如,
hrpdb的OBJ$表中存在描述mytable的新行,但 CDB 根的OBJ$表中不存在该行。因此,在 CDB 根中查询DBA_OBJECTS,在hrdpb中查询DBA_OBJECTS会显示不同的结果。 -
数据链路
注:在 Oracle Database 12c 发行版 1 (12.1.0.2) 中,数据链接称为对象链接。
在某些情况下,Oracle AI Database 仅在应用程序容器的应用程序根中存储一次对象的数据(不仅是元数据)。考虑为不同区域设置不同 PDB 的电子商务公司。应用程序根可以存储名为
postal_codes的表,该表列出了所有美国邮政编码。此容器中的每个应用程序 PDB 都需要访问公用postal_codes表。应用程序 PDB 使用称为数据链接的内部机制来引用应用程序根中的对象。在其中创建数据链接的应用程序 PDB 还存储数据链接说明。数据链接会继承它所引用的对象的数据类型。
-
扩展数据链接
扩展数据链路是数据链路和元数据链路的混合体。与数据链接类似,扩展数据链接指的是应用程序根中的对象。但是,扩展数据链接还引用了应用程序 PDB 中的对应对象。例如,应用程序 PDB 可能具有扩展数据链接表,该表存储美国邮政编码和加拿大邮政编码。与元数据链接一样,应用程序 PDB 中的对象从应用程序根中的相应对象继承元数据。
在应用程序根中查询时,扩展数据链接表仅从应用程序根提取行,例如,仅从美国邮政编码提取行。但是,在应用程序 PDB 中查询时,扩展数据链接表会从应用程序根和应用程序 PDB(例如,美国邮政编码和加拿大邮政编码)中提取行。
Oracle AI Database 会自动创建和管理指向 CDB$ROOT 的元数据和数据链接。用户无法添加、修改或删除这些链接。
另请参见:
-
“应用程序公用对象”
-
Oracle AI Database Concepts,了解数据字典概述
数据字典视图的公共同义词
Oracle AI Database 为许多数据字典视图创建公共同义词,以便用户可以方便地访问它们。
安全管理员还可以为系统范围使用的方案对象创建其他公共同义词。Oracle 建议不要对专用方案对象和公共同义词使用相同的名称。
另请参阅:“同义词概述”
数据字典高速缓存
大部分数据字典信息都位于数据字典高速缓存中,因为数据库始终需要这些信息来验证用户访问和验证方案对象的状态。
高速缓存通常包含语法分析信息。描述表及其列的 COMMENTS 列不会缓存到字典高速缓存中,但可以缓存到数据库缓冲区高速缓存中。
另请参阅:“数据字典高速缓存”
其他程序和数据字典
其他 Oracle AI Database 产品可以引用现有视图并创建其他数据字典表或自己的视图。
Oracle 建议编写引用数据字典的程序的应用程序开发人员使用公共同义词,而不是底层表。同义词在发行版之间不太可能更改。
数据字典存储
将 CDB 元数据整体存储的数据字典仅存储在系统表空间中。
存储特定 PDB 元数据的数据字典存储在专用于此 PDB 的自包含表空间中。PDB 表空间包含应用程序后端的数据和元数据。因此,每组数据字典表都存储在自己的专用表空间集中。
另请参阅:“ SYSTEM 表空间”了解有关 SYSTEM 表空间的更多信息
动态性能视图概览
在整个操作过程中,Oracle AI Database 会维护一组记录当前数据库活动的虚拟表。
这些视图是动态的,因为它们在数据库打开和使用期间会不断更新。这些视图有时称为 V$ 视图,因为其名称以 V$ 开头。
动态性能视图包含如下信息:
动态性能视图具有以下主要用途:
-
Oracle Enterprise Manager 使用视图获取有关数据库的信息。
-
管理员可以使用这些视图进行性能监视和调试。
-
动态性能视图的内容 动态性能视图称为固定视图,因为它们无法由数据库管理员更改或删除。但是,数据库管理员可以在表上查询和创建视图,并将对这些视图的访问权限授予其他用户。
-
动态性能视图的存储动态性能视图基于基于数据库内存结构构建的虚拟表。另请参阅:Oracle AI Database Reference,了解动态性能视图的完整列表
动态性能视图的内容
动态性能视图称为固定视图,因为数据库管理员无法更改或删除它们。但是,数据库管理员可以在表上查询和创建视图,并将对这些视图的访问权限授予其他用户。
SYS 拥有动态性能表,其名称以 V_$ 开头。将对这些表创建视图,然后使用以 V$ 为前缀的公共同义词。例如,V$DATAFILE 视图包含有关数据文件的信息。V$FIXED_TABLE 视图包含有关所有动态性能表和视图的信息。
对于几乎每个 V$ 视图,都存在对应的 GV$ 视图。在 Oracle Real Application Clusters (Oracle RAC) 中,查询 GV$ 视图将从所有限定数据库实例检索 V$ 视图信息。
使用数据库配置辅助程序 (Database Configuration Assistant,DBCA) 创建数据库时,Oracle 会自动创建数据字典。Oracle AI Database 会自动运行 catalog.sql 脚本,其中包含动态性能视图的视图定义和公共同义词。必须运行 catalog.sql 才能创建这些视图和同义词。
另请参见:
-
Oracle AI Database Administrator’s Guide,了解如何手动运行
catalog.sql -
Oracle Real Application Clusters Administration and Deployment Guide(了解如何在 Oracle RAC 中使用性能视图)
动态性能视图的存储
动态性能视图基于基于数据库内存结构构建的虚拟表。
视图不是数据库中存储的常规表。无法保证视图的读取一致性,因为数据是动态更新的。
由于动态性能视图不是真表,因此数据取决于数据库和数据库实例的状态。例如,可以在数据库启动但未挂载时查询 V$INSTANCE 和 V$BGPROCESS。但是,在装载数据库之前,无法查询 V$DATAFILE。
另请参阅:“数据并发性和一致性”
数据库对象元数据
DBMS_METADATA 软件包和 DBMS_DEVELOPER.GET_METADATA 函数提供了用于提取数据库对象的完整定义的接口。
使用 DBMS_METADATA 程序包,定义可以表示为 XML 或 SQL DDL。Oracle AI Database 提供了两种样式的界面:用于编程控制的灵活、复杂的界面,以及用于即席查询的简化界面。
使用 DBMS_DEVELOPER.GET_METADATA 函数,对象元数据将作为 JSON 文档返回。
另请参阅:《Oracle AI Database PL/SQL Packages and Types Reference 》,了解有关 DBMS_METADATA 的更多信息。《Oracle AI Database PL/SQL Packages and Types Reference 》,了解有关 DBMS_DEVELOPER.GET_METADATA 的更多信息。