PARTI-Oracle关系数据结构-数据字典与动态性能视图
6. 数据字典与动态性能视图
6.1. 数据字典概述
Oracle数据库的一个重要组成部分是其数据字典,这是一个只读的表集合,提供了有关数据库的管理元数据。数据字典包含如下信息:
- 数据库中每个模式对象的定义,包括列的默认值和完整性约束信息
- 分配给模式对象的空间量以及当前使用的量
- Oracle数据库用户的名称、授予用户的权限和角色,以及与用户相关的审计信息(见第17-1页的“用户账户”)
数据字典是每个Oracle数据库数据管理的核心部分。例如,数据库执行以下操作:
- 访问数据字典以查找有关用户、模式对象和存储结构的信息
- 每次发出DDL语句时修改数据字典(见第7-3页的“数据定义语言(DDL)语句”)
因为Oracle数据库将数据字典数据存储在表中,就像其他数据一样,用户可以使用SQL查询这些数据。例如,用户可以运行SELECT语句来确定他们的权限,他们的模式中存在哪些表,这些表中有哪些列,是否在这些列上建立了索引等。
6.1.1. 数据字典的内容
数据字典由以下类型的对象组成:
-
基础表
这些底层表存储有关数据库的信息。只有Oracle数据库应该写入和读取这些表。用户很少直接访问基础表,因为它们是规范化的,大多数数据都以难以理解的格式存储。 -
视图
这些视图使用连接和WHERE子句将基础表数据解码成有用的信息,例如用户或表名,以简化信息。这些视图包含数据字典中所有对象的名称和描述。一些视图对所有数据库用户都是可访问的,而其他视图则仅供管理员使用。
通常,数据字典视图是成组的。在许多情况下,一组由三个包含类似信息的视图组成,它们通过前缀来区分,如表6-1所示。通过查询适当的视图,您可以只访问对您相关的信息。
不是所有的视图集合都包含三个成员。例如,数据字典中包含一个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
. . .
6.1.1.1. DBA_视图
带有DBA_前缀的视图显示整个数据库中的所有相关信息。DBA_视图仅供管理员使用。例如,以下查询显示了数据库中所有对象的信息:
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE FROM DBA_OBJECTS ORDER BY OWNER, OBJECT_NAME;
6.1.1.2. 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_视图时,应该意识到角色的影响,因为在存储过程中角色默认情况下不会被启用。
6.1.1.3. USER_视图
对典型数据库用户最感兴趣的视图是带有USER_前缀的视图。这些视图:
- 指的是用户在数据库中的私有环境,包括用户创建的模式对象的元数据、用户授予的权限等
- 只显示与用户相关的行,返回ALL_视图中信息的一个子集
- 除了列OWNER是隐含的之外,其他列与其它视图相同,可以有简略的PUBLIC同义词以方便使用
例如,以下查询返回了您的模式中包含的所有对象:
SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS ORDER BY OBJECT_NAME;
6.1.1.4. DUAL表
DUAL 是数据字典中的一个小表,Oracle数据库和用户编写的程序可以引用它以保证一个已知的结果。DUAL表在必须只返回一次值时非常有用,例如当前的日期和时间。所有数据库用户都可以访问DUAL。
DUAL表有一个名为DUMMY的列和一行,包含值X。以下示例查询DUAL以执行算术运算:
SQL> SELECT ((3*4)+5)/3 FROM DUAL;
((3*4)+5)/3
----------
5.66666667
6.1.2. 数据字典的存储
数据字典基础表是任何Oracle数据库中首先创建的对象。数据库的所有数据字典表和视图都存储在SYSTEM表空间中。因为当数据库打开时,SYSTEM表空间始终在线,所以当数据库打开时,数据字典始终可用。
6.1.3. Oracle数据库如何使用数据字典
Oracle数据库用户SYS拥有数据字典的所有基础表和用户可访问的视图。数据字典基础表中的数据对于Oracle数据库的运行是必要的。因此,只有Oracle数据库应该写入或更改数据字典信息。没有任何Oracle数据库用户应该更改SYS模式中包含的行或模式对象,因为这样的活动可能会危及数据完整性。安全管理员必须严格控制这个中心账户。
警告:更改或操纵数据字典表中的数据可能会永久性地对数据库操作产生不利影响。
在数据库运行期间,Oracle数据库读取数据字典以确认模式对象的存在以及用户对它们的适当访问权限。Oracle数据库还不断更新数据字典,以反映数据库结构、审计、授权和数据的变更。
例如,如果用户hr创建了一个名为interns的表,那么数据字典中会添加新行,以反映新表、列、段、扩展和hr对表的权限。下次查询字典视图时,这些新信息将可见。
6.1.3.1. 数据字典视图的公共同义词
Oracle数据库为许多数据字典视图创建了公共同义词,以便用户可以方便地访问它们。安全管理员还可以为全系统使用的模式对象创建额外的公共同义词。用户应避免将自己的模式对象命名为与公共同义词相同的名称。
6.1.3.2. 为快速访问而缓存数据字典
数据字典的大部分信息都存储在数据字典缓存中,因为数据库不断地需要这些信息来验证用户访问权限和核实模式对象的状态。解析信息通常保存在缓存中。描述表及其列的COMMENTS列不缓存在数据字典缓存中,但可能会缓存在数据库缓冲区缓存中。
6.1.3.3. 其他程序和数据字典
其他Oracle数据库产品可以引用现有的视图,并创建自己的额外数据字典表或视图。编写引用数据字典的程序的应用程序开发人员应该引用公共同义词,而不是底层表。同义词在不同版本之间更改的可能性较小。
6.2. 动态性能视图概述
在其运行过程中,Oracle数据库维护了一组虚拟表,记录当前的数据库活动。这些视图被称为动态性能视图,因为它们在数据库打开和使用时会不断更新。这些视图,有时也称为V$视图,包含如下信息:
- 系统和会话参数
- 内存使用和分配
- 文件状态(包括RMAN备份文件)
- 作业和任务的进度
- SQL执行
- 统计和指标
动态性能视图主要有以下用途:
-
Oracle Enterprise Manager使用这些视图来获取数据库的信息(见第18-2页的“Oracle Enterprise Manager”)。
-
管理员可以使用这些视图进行性能监控和调试。
6.2.1. 动态性能视图内容
动态性能视图有时被称为固定视图,因为数据库管理员不能更改或删除它们。然而,数据库管理员可以查询这些表,并在这些表上创建视图,并将这些视图的访问权限授予其他用户。SYS拥有以V_$开头的动态性能表。在这些表上创建视图,然后创建以V$为前缀的公共同义词。例如,V$DATAFILE视图包含有关数据文件的信息。V$FIXED_TABLE视图包含有关所有动态性能表和视图的信息。对于几乎每个V$视图,都存在一个对应的GV$视图。在Oracle实时应用集群(Oracle RAC)中,查询GV$视图可以从所有合格的数据库实例中检索V$视图信息(见第17-13页的“数据库服务器网格”)。
当您使用数据库配置助手(DBCA)创建数据库时,Oracle会自动创建数据字典。Oracle数据库会自动运行catalog.sql脚本,该脚本包含动态性能视图的视图和公共同义词的定义。您必须运行catalog.sql来创建这些视图和同义词。
6.2.2. 动态性能视图存储
动态性能视图是基于从数据库内存结构构建的虚拟表。因此,它们不是存储在数据库中的常规表。由于数据是动态更新的,所以不保证视图的读取一致性。
由于动态性能视图不是真正的表,数据取决于数据库和实例的状态。例如,在数据库启动但未装载时,您可以查询V$INSTANCE和V$BGPROCESS,但是在数据库已装载之前,您无法查询V$DATAFILE。
6.3. 数据库对象元数据
DBMS_METADATA包提供了提取数据库对象完整定义的接口。这些定义可以以XML或SQL DDL的形式表示。提供了两种风格的接口:一种是用于程序控制的灵活、复杂的接口,另一种是用于临时查询的简化接口。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示