前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【DB笔试面试539】在Oracle中,数据字典分为哪几类?

【DB笔试面试539】在Oracle中,数据字典分为哪几类?

作者头像
小麦苗DBA宝典
发布2019-09-29 15:18:18
1.2K0
发布2019-09-29 15:18:18
举报

题目部分

在Oracle中,数据字典分为哪几类?

答案部分

数据字典(Data Dictionary)也就是通常所说的系统目录,它是Oracle数据库中最重要的组成部分。数据字典记录了数据库的系统信息,它是只读表和视图的集合,数据字典的所有者为SYS用户,所有的数据字典表和视图都被储存在该数据库的SYSTEM表空间中。用户只能在数据字典上执行查询操作,而其维护和修改是由系统自动完成的。数据字典中存放了数据库自身的很多信息,包括了用于描述数据库和它的所有对象的信息,所以,数据字典是每个Oracle数据库的核心。例如一个表的创建者信息,创建时间信息,所属表空间信息,用户访问权限信息等。

Oracle数据字典可以包括四个层次,分别为X$内部表、基础数据字典表、数据字典视图和动态性能视图。

一.内部RDBMS(X$)表

X$表是Oracle数据库的核心部分,用于跟踪数据库内部信息,维护数据库的正常运行。X$是加密命名的,而且Oracle官方文档不做说明,例如,X$BH、X$KSMSP等。X$表是Oracle数据库的运行基础,在数据库启动时由Oracle应用程序自动创建。所以,Oracle不允许SYSDBA以外的用户直接访问,也不能授权给其他用户。一般而言,对于这种对象,进行观察、发现、研究X$表的好办法是借用Oracle的AUTOTRACE功能,当查询一些视图时,可以发现这些X$底层表,例如查询V$PARAMETER时。

普通用户如何查询X$内部表呢?以X$BH表为例,以SYS用户执行以下命令即可:

CREATE OR REPLACE VIEW BH AS SELECT * FROM SYS.X$BH;

CREATE OR REPLACE PUBLIC SYNONYM X$BH FOR BH;

二.数据字典表

数据字典表用以存储表、索引、约束以及其他数据库结构的信息。这些对象通常是以“$”结尾(例如:TAB$、OBJ$、TS$等)。Bsq是非常重要的一个文件,其中包含了数据字典的定义以及注释说明,深入学习Oracle数据库的用户都应该仔细阅读该文件,该文件位于$ORACLE_HOME/rdbms/admin目录下(在Oracle 11g中bsq文件被分别归类到不通的.bsq文件)。这些数据字典表对于数据库的稳定运行生死攸关,所以通常Oracle不允许直接对数据字典进行操作。当用户执行DDL和DML操作时,在后台Oracle将这些操作解析为对于数据字典的自动执行。

三.静态数据字典视图

由于X$表和数据字典表通常不能直接访问,因此,Oracle创建了静态数据字典视图提供用户对于数据字典信息的访问,由于这些信息相对稳定、不能直接修改,所以又被称为静态数据字典视图。静态数据字典主要反应的是数据库中的对象信息。静态数据字典视图是由catalog.sql脚本创建(在$ORACLE_HOME/rdbms/admin下)。静态数据字典中的视图可以分为三类,它们分别由三个前缀构成:USER_*、ALL_*和DBA_*。

(1) USER_*:该类视图存储了关于当前用户所拥有的对象的信息,即所有在该用户模式下的对象,例如:USER_USERS、USER_TABLES、USER_VIEWS。

(2) ALL_*:该类视图存储了当前用户能够访问的对象的信息。(与USER_*相比,ALL_*并不需要拥有该对象,只需要具有访问该对象的权限即可),例如:ALL_USERS、ALL_TABLES、ALL_VIEWS。

(3) DBA_*:该类视图存储了数据库中所有对象的信息。(前提是当前用户具有访问这些数据库的权限,一般来说,必须具有管理员权限)。例如:DBA_USERS、DBA_TABLES、DBA_VIEWS。

这里要说明一下,并不是所有的对象都是有三层对象视图,有时候all_层视图是被省略掉的,例如dba_recyclebin,就没有对应的all_层视图。

四.动态性能视图

Oracle包含了一些潜在的由系统管理员如SYS维护的表和视图,由于当数据库运行的时候它们会不断进行更新,所以,称它们为动态数据字典,也称为动态性能视图(Dynamic Performance Views)。这些视图提供了关于内存和磁盘的运行情况,记录了数据库运行时信息和统计数据,大部分动态性能视图被实时更新以反映数据库的当前状态。所以,只能对其进行只读访问而不能修改它们。动态数据字典是依赖数据库运行的性能的,反映数据库运行的一些内在信息,所以,在访问这类数据字典时往往不是一成不变的。动态性能视图基于从数据库内存结构构建的虚拟表。因此,它们不是存储在数据库中的常规表。由于数据动态更新,所以,动态性能视图的读一致性不能保证。

SYS是这些底层动态性能表的所有者,这些底层动态性能表的名字都以V$开头,而且Oracle会为这些底层动态性能表创建SYS用户的视图,这些视图的名称以V$_开头,基于这些表的视图被创建后,Oracle还会为这些视图创建公共同义词,同义词名称以V$开头,和这些动态性能表名称保持一致,例如,视图V$DATAFILE包含数据库数据文件的信息,而V$FIXED_TABLE包含数据库中所有动态性能表和视图的信息。NOMOUNT状态不能查询所有的V$视图。因为动态性能视图不是真实表,所以数据依赖于数据库和实例的状态。例如,当数据库处于NOMOUNT时,可以查询V$INSTANCE和V$BGPROCEP。但是,在MOUNT数据库之前,不能查询V$DATAFILE。

数据字典基表是在任何Oracle数据库中创建的第一个对象。数据库的所有数据字典表和视图都存储在系统表空间中。所以,数据字典视图是受读一致性的影响的。因为当数据库打开时,系统表空间总是联机的,所以当数据库打开时,数据字典总是可用的。总之,运用好数据字典技术,可以让数据库开发人员能够更好地了解数据库的全貌,这样对于数据库优化、管理等有极大的帮助。

V$动态视图是描述Oracle当前运行状态的一系列视图集合。这部分视图的特点是以V$开头,描述系统当前状态信息。常见常用的如V$SESSION、V$SESSION_WAIT(Oracle 10g后,其中内容融入到V$SESSION中)、V$LOCK和V$SYSSTAT等。只有赋予了SELECT ANY DICTIONARY权限的用户才可以查询所有的V$视图。

V$视图传统上是代表系统当前状态的描述,也就是即时性视图。虽然可以描述当前系统中发生的瓶颈或者性能问题,但是当瓶颈接触之后,很难发现和分析过去一个事件点的系统状态和问题SQL。同时,如果需要对运行时间段的情况进行分析,采用时间段镜像snap技术也存在一些偶然性。

从Oracle 10g开始,V$动态视图进入了一个新的时代,可以保存V$SESSION的历史信息。ASH(Active Session History)技术就是每个一个间隔的时间段,保存当前动态视图的镜像进行保存,这些信息保存7天。借助ASH技术,Oracle提出了基于历史进行分析的AWR(Automatic Workload Report)报表。最后,从性能主动优化的出发点,提出了ADDM(Automatic Database Diagnostic Monitor)报告,提供智能化的数据库优化提示。这些方便的功能特性,全都是基于动态视图。v$动态视图主要是针对SGA和数据库实例进程的显示。在这个过程中,Oracle使用了DMA(Direct Memory Access)技术,可以高效的获取这些分析数据。

数据库启动时,Oracle动态创建X$表,在此基础之上,Oracle创建了GV$和V$视图。从Oracle 8开始GV$视图开始被引入,其含义是Global,除一些特例之外,每个V$视图都有一个对应的GV$视图存在;GV$视图的产生是为了满足OPS/RAC环境的需要;每个V$视图都包含如下类似语句,用于限制返回当前实例的信息:

Where inst_id=USERENV('Instance');

下面介绍几个与系统数据字典视图定义有关的几个视图,而其它的视图学习也可以根据下面这几个视图来学习:

(一)DICTIONARY和DICT_COLUMNS

l DICTIONARY视图记录了全部数据字典表的名称和解释,它有一个同义词DICT。

l DICT_COLUMNS视图记录了全部数据字典表里字段名称和解释。

如果想查询跟索引有关的数据字典,那么可以使用如下SQL语句:

SELECT * FROM DICTIONARY WHERE INSTR(COMMENTS, 'index') > 0;

如果想知道数据字典中的USER_INDEXES视图中各字段的详细含义,那么可以用如下SQL语句:

SELECT COLUMN_NAME, COMMENTS

  FROM DICT_COLUMNS

 WHERE TABLE_NAME = 'USER_INDEXES';

依此类推,就可以轻松知道数据字典的详细名称和解释,不用查看Oracle的其它文档资料了。当然上面的结果也可以用如下语句来查询:

SELECT * FROM DBA_COL_COMMENTS UCC WHERE UCC.TABLE_NAME='USER_INDEXES';

SELECT * FROM DBA_TAB_COMMENTS UTC WHERE UTC.TABLE_NAME='USER_INDEXES';

(二)V$FIXED_TABLE和V$FIXED_VIEW_DEFINITION

面试官可能会这样问:“在Oracle中,哪个视图可以查询数据中所有底层的表?”。答案就是V$FIXED_TABLE。V$FIXED_TABLE可以查询数据库中所有底层的表。V$FIXED_TABLE视图显示数据库中所有动态性能表、视图和导出表。由于某些V$表(例如V$ROLLNAME)涉及底层的表,因此,没有列出。另外,V$FIXED_VIEW_DEFINITION这个视图包含所有固定视图(以V$起头的视图)的定义,如下所示:

  SYS@ORALHRDB1> DESC V$FIXED_TABLE
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 NAME                                               VARCHAR2(30)
 OBJECT_ID                                          NUMBER
 TYPE                                               VARCHAR2(5)
 TABLE_NUM                                          NUMBER
SYS@ORALHRDB1>SELECT VIEW_DEFINITION FROM V$FIXED_VIEW_DEFINITION WHERE VIEW_NAME='V$FIXED_TABLE';
VIEW_DEFINITION
--------------------------------------------------------------------------------
select  NAME , OBJECT_ID , TYPE , TABLE_NUM from GV$FIXED_TABLE where inst_id =
USERENV('Instance')
SYS@ORALHRDB1> SELECT VIEW_DEFINITION FROM V$FIXED_VIEW_DEFINITION WHERE VIEW_NAME='GV$FIXED_TABLE';
VIEW_DEFINITION
--------------------------------------------------------------------------------
select inst_id,kqftanam, kqftaobj, 'TABLE', indx from x$kqfta union all select i
nst_id,kqfvinam, kqfviobj, 'VIEW', 65537 from x$kqfvi union all select inst_id,k
qfdtnam, kqfdtobj, 'TABLE', 65537 from x$kqfdt

可以看到底层的表主要由x$kqfta和x$kqfdt组成,而x$kqfvi主要是视图的定义。

下表给出了一些常见的数据字典及其解释:

表 3-15 常见的数据字典

视图名称

解释

视图名称

解释

DBA_TABLES(TABS)

所有用户(当前用户)的所有表的信息

DBA_FREE_SPACE

记录系统表空间的自由空间的信息

DBA_TAB_COLUMNS(COLS)

所有用户(当前用户)的表的列的信息

V$CONTROLFILE

记录系统控制文件的基本信息

DBA_VIEWS

所有用户的所有视图信息

V$PARAMETER

记录系统各参数的基本信息

DBA_SYNONYMS(SYN)

所有用户(当前用户)同义词信息

V$CONTROLFILE_RECORD_SECTION

记录系统控制运行的基本信息

DBA_SEQUENCES(SEQ)

所有用户(当前用户)序列信息

V$DATAFILE

记录来自控制文件的数据文件信息

DBA_CONSTRAINTS

用户的表的约束信息

V$FILESTAT

记录数据文件读写的基本信息

DBA_INDEXES(IND)

所有用户(当前用户)索引的简要信息

V$DATAFILE_HEADER

记录数据文件头部的基本信息

DBA_IND_COLUMNS

所有用户索引的列信息

V$THREAD

记录日志线程的基本信息

DBA_TRIGGERS

所有用户触发器信息

V$LOG

记录日志文件的基本信息

DBA_SOURCE

所有用户存储过程信息

V$LOGFILE

记录日志文件的概要信息

DBA_SEGMENTS

所有用户段(表,索引及Cluster)使用空间的信息

V$ARCHIVED_LOG

记录归档日志文件的基本信息

DBA_EXTENTS

所有用户段的扩展段信息

V$ARCHIVE_DEST

记录归档日志的路径信息

DBA_OBJECTS

所有用户对象的基要信息

V$INSTANCE

记录当前实例的基本信息

CAT

当前用户可以访问的所有基表

V$SYSTEM_PARAMETER

显示实例当前有效的参数信息

TAB

当前用户创建的所有基表,视图,同义词等

V$SGA

显示SGA区的大小信息

DICT

构成数据字典的所有表的信息

V$SGASTAT

记录SGA使用统计详细信息

V$DATABASE

记录系统运行的情况

V$DB_OBJECT_CACHE

记录对象缓存大小信息

DBA_TABLESPACES

记录系统表空间的基本信息

V$BGPROCESS

显示后台进程信息

DBA_DATA_FILES

记录系统数据文件及表空间的基本信息

V$SESSION

显示当前会话信息

V$SORT_USAGE

显示临时段的大小及会活、可以看出哪些进程硬盘排序

V$FIXED_TABLE

列出当前发行的固定对象的说明

V$SQLAREA

列出共享区的SQL使用统计

V$LATCH

列出锁存器的统计数据

V$SQLTEXT

在SGA中属于共享SQL游标的SQL语句内容

V$LIBRARYCHCHE

有关库缓存性能的统计数据

V$SYSSTAT

包括基本的实例统计数据

V$ROLLSTAT

列出联机的回滚段的名字

V$SYSTEM_EVENT

包括一个事件的总等待时间

V$ROWCACHE

显示活动数据字典的统计

V$WAITSTAT

列出块竞争统计数据,只有当时间统计数据参数被“使能”时系统才能对其更新

& 说明:

有关Oracle数据字典的更多内容可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-2153324/

本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DB宝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档