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数据库产品可以引用现有的视图,并创建自己的额外数据字典表或视图。编写引用数据字典的程序的应用程序开发人员应该引用公共同义词,而不是底层表。同义词在不同版本之间更改的可能性较小。