Oracle 数据库的​​数据字典(Data Dictionary)​​是其核心元数据存储系统,用于记录数据库中所有对象(如表、索引、用户、约束等)的结构信息、状态信息以及运行时的动态数据。它是数据库管理系统(DBMS)管理数据库的“地图”,为数据库管理员(DBA)、开发人员和普通用户提供了查询和分析数据库对象的依据。

​​一、数据字典的核心特点​​

  1. ​存储位置​​:数据字典主要存储在 SYSTEM表空间中,由 SYS用户拥有,所有用户通过视图间接访问。

  2. ​组成结构​​:

    • ​基表(Base Tables)​​:最底层的物理表(如 OBJ$TAB$COL$等),存储原始元数据,​​不建议直接查询​​(格式复杂且可能变动)。

    • ​视图(Views)​​:基于基表构建的逻辑视图(如 DBA_TABLESUSER_USERS等),经过 Oracle 封装,提供更易读的结构化信息。

  3. ​权限控制​​:不同视图对应不同权限级别(DBA_ALL_USER_前缀),确保数据安全。

​​二、数据字典的分类​​

根据功能和用途,Oracle 数据字典可分为两类:

​​1. 静态数据字典(Static Data Dictionary)​​

记录数据库对象的​​结构化元数据​​(如对象定义、属性、关系等),反映数据库的“静态结构”。

常见视图以 DBA_ALL_USER_开头(统称为“三巨头”视图),区别如下:

视图前缀

描述

所需权限

DBA_

全局视角,包含数据库中​​所有对象​​的详细信息(如所有表、索引、约束)

SELECT ANY DICTIONARYDBA权限

ALL_

当前用户​​有权限访问的所有对象​​的信息(包括自己和其他用户的对象)

无需特殊权限(默认拥有)

USER_

当前用户​​自己拥有的对象​​的信息(仅属于该用户的对象)

无需特殊权限(默认拥有)

​常用静态视图示例​​:

视图名称

描述

DBA_USERS

所有数据库用户信息

USERNAME(用户名)、ACCOUNT_STATUS(账户状态)、CREATED(创建时间)

DBA_TABLES

所有表的信息

TABLE_NAME(表名)、OWNER(所有者)、TABLESPACE_NAME(表空间)、ROWS(行数近似值)

DBA_COLUMNS

所有列的信息

TABLE_NAME(表名)、COLUMN_NAME(列名)、DATA_TYPE(数据类型)、DATA_LENGTH(长度)

DBA_INDEXES

所有索引的信息

INDEX_NAME(索引名)、TABLE_OWNER(表所有者)、TABLE_NAME(表名)、UNIQUENESS(是否唯一)

DBA_CONSTRAINTS

所有约束(主键、外键、唯一约束等)的信息

CONSTRAINT_NAME(约束名)、TABLE_NAME(表名)、CONSTRAINT_TYPE(约束类型,如P=主键、R=外键)

DBA_TABLESPACES

所有表空间的信息

TABLESPACE_NAME(表空间名)、BLOCK_SIZE(块大小)、STATUS(状态)

DBA_SEQUENCES

所有序列的信息

SEQUENCE_NAME(序列名)、INCREMENT_BY(步长)、LAST_NUMBER(最后生成的值)

​​2. 动态性能视图(Dynamic Performance Views)​​

记录数据库​​运行时的动态信息​​(如实话会话、SQL执行、锁竞争、内存使用等),反映数据库的“实时状态”。

这类视图以 V$GV$开头(GV$是全局视图,支持 RAC 集群),数据来自 Oracle 内核的内存结构,​​重启后丢失​​。

​常用动态视图示例​​:

视图名称

描述

V$SESSION

当前所有会话的信息

SID(会话ID)、SERIAL#(会话序列号)、USERNAME(用户名)、STATUS(状态)、MACHINE(客户端机器)

V$SQL

共享池中 SQL 语句的信息

SQL_ID(SQLID)、EXECUTIONS(执行次数)、ELAPSED_TIME(总耗时)、SQL_TEXT(SQL文本片段)

V$LOCK

当前锁信息

SID(持有锁的会话)、TYPE(锁类型)、LMODE(锁模式)、REQUEST(请求的锁模式)

V$SGA

SGA 内存各组件的大小

NAME(组件名)、VALUE(大小,字节)

V$INSTANCE

当前实例的基本信息

INSTANCE_NAME(实例名)、HOST_NAME(主机名)、STATUS(实例状态)

V$LOG

重做日志文件的信息

GROUP#(日志组号)、STATUS(状态,如CURRENT=当前日志)、MEMBERS(成员数)

​​三、如何使用数据字典?​​

​​1. 查询静态信息​​

例如,查看当前用户拥有的所有表:

SELECT TABLE_NAME, TABLESPACE_NAME, STATUS 
FROM USER_TABLES;

查看 SCOTT用户的所有索引:

SELECT INDEX_NAME, TABLE_NAME, UNIQUENESS 
FROM ALL_INDEXES 
WHERE OWNER = 'SCOTT';

查看 EMP表的列信息:

SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH 
FROM USER_TAB_COLUMNS 
WHERE TABLE_NAME = 'EMP';

​​2. 监控动态状态​​

例如,查看当前活跃的会话(非空闲):

SELECT SID, SERIAL#, USERNAME, STATUS, MACHINE, PROGRAM 
FROM V$SESSION 
WHERE STATUS = 'ACTIVE' AND USERNAME IS NOT NULL;

查看消耗 CPU 最多的 SQL 语句:

SELECT SQL_ID, EXECUTIONS, ELAPSED_TIME/1000000 AS ELAPSED_SEC, SQL_TEXT 
FROM V$SQL 
ORDER BY ELAPSED_TIME DESC 
FETCH FIRST 10 ROWS ONLY;

​​注意事项​​

  1. ​基表不可直接查询​​:DBA_/ALL_/USER_视图是对基表的封装,直接查询基表(如 OBJ$)可能导致结果不可读或兼容性问题。

  2. ​权限限制​​:普通用户只能访问 USER_和部分 ALL_视图,DBA_视图需要 DBA角色或 SELECT ANY DICTIONARY系统权限。

  3. ​动态视图的时效性​​:V$视图的数据随数据库状态实时变化(如会话结束后信息消失),适合实时监控。

  4. ​性能影响​​:频繁查询大表(如 DBA_TABLES)可能消耗资源,建议添加过滤条件(如 WHERE OWNER = 'SCOTT')。