【转载】Oracle数据字典详解

转自:http://czmmiao.iteye.com/blog/1258462

Oracle数据字典概述 

数据库是数据的集合,数据库维护和管理这用户的数据,那么这些用户数据表都存在哪里,用户的信息是怎样的,存储这些用户的数据的路径在哪里,这些信息不属于用户的信息,却是数据库维护和管理用户数据的核心,这些信息就是数据库的数据字典来维护的,数据库的数据字典就汇集了这些数据库运行所需要的基础信息叻。每个数据库都提供了各自的数据字典的方案,虽然形式不同,但是目的和作用是一样的,比如在mysql里数据字典是在information_schema 里表现的,sqlserver则是在sys这个系统schema里来展示的。
Oracle的数据字典是Oracle数据库安装之后,自动创建的一系列数据库对象。数据字典是Oracle数据库对象结构的元数据信息。熟悉和深入研究数据字典对象,可以很大程度的帮助我们了解Oracle内部机制。
Oracle字典视图包括四个层次,分别为X$内部表、基础数据字典表、数据字典视图和动态性能视图。

数据字典表和用户创建的表没有什么区别,不过数据字典表里的数据是Oracle系统存放的系统数据,而普通表存放的是用户的数据而已,为了方便的区别这些表,这些表的名字都是用"$"结尾,在我们看到的sql语句里看到"$"结尾的这些表,大家就可以想到这可能是一个数据字典表了,同样,既然如此,我们创建自己的用户表的时候就不要用“$”结尾,以免让别人误会,数据字典表是系统存放系统用户的,所以他的owner是sys,在手工用create database的命令的时候,会调用$ORACLE_HOME/rdbms/admin/sql.bsq文件,这个就会执行生成我们这些数据字典表。打开sql.bsq会发现很多数据字典几乎都以$结尾,比如col$,tab$等。

对于数据字典表,里面的数据是有数据库系统自身来维护的,所以这里虽然和普通表一样可以用DML语句来修改数据内容,但是大家最好还是不要自己来做了,因为这些表都是作用于数据库内部的,我们有时看到的604的的recursive sql这里的sql实际上很有可能就是我们的相关的数据字典表的执行内容。所以这里我们切记记住不要去修改这些表里的内容。

刚才说道了。这里的数据字典表的用户都是sys,存在在system这个表空间里,表名都用"$"结尾,为了便于用户对数据字典表的查询,这样的名字是不利于我们记忆的,所以Oracle对这些数据字典都分别建立了用户视图视图,不仅有更容易接受的名字,还隐藏了数据字典表表之间的关系,让我们字节通过视图来进行查询,简单而形象,Oracle针对这些对象的范围,分别把视图命名为DBA_XXXX, ALL_XXXX和USER_XXXX

user_对象视图:描述了当前用户schema下的对象;
all_对象视图:描述了当前用户有权限访问到的所有对象的信息;
dba_对象视图:包括了所有数据库对象的信息;

注意:在创建数据库是会运行两个脚本。先运行catalog.sql,该脚本用来创建数据库的内部字典表。然后再运行catrpoc.sql,该脚本用来创建数据库内建的存储过程、包等pl\sql对象。如果我们是使用dbca来创建数据库,则dbca会自动调用这两个脚本。否则在执行create database命令来创建时,则需要手工运行这两个脚本。

追踪数据字典 

数据字典视图非常多,我们无法一一记住,但是有个视图,我们必须知道,那就是dictionary视图,该视图里记录了所有的数据字典视图的名称。所以当我们需要查找某个数据字典而又不知道这个信息在哪个视图里的时候,就可以在dictionary视图里找。该视图还有个同名词dict。下面我们来追踪下dba_synonyms

SQL> desc dict
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TABLE_NAME                                         VARCHAR2(30)
 COMMENTS                                           VARCHAR2(4000)

SQL> select table_name from dict where table_name like'%SYNONYM%';

TABLE_NAME
------------------------------
DBA_SYNONYMS
USER_SYNONYMS
ALL_SYNONYMS

在DBA_SYNONYMS验证下dba_synonyms是否为同名词

SQL>select OWNER,SYNONYM_NAME,TABLE_NAME from dba_synonyms where SYNONYM_NAME='DBA_SYNONYMS'

OWNER                          SYNONYM_NAME                   TABLE_NAME
------------------------------ ------------------------------ ------------------------------
PUBLIC                         DBA_SYNONYMS                   DBA_SYNONYMS

果然,DBA_SYNONYMS为

Oracle数据字典概述 

数据库是数据的集合, 数据库维护和管理这用户的数据,那么这些用户数据表都存在哪里,用户的信息是怎样的,存储这些用户的数据的路径在哪里,这些信息不属于用户的信息,却是数 据库维护和管理用户数据的核心,这些信息就是数据库的数据字典来维护的,数据库的数据字典就汇集了这些数据库运行所需要的基础信息叻。每个数据库都提供了 各自的数据字典的方案,虽然形式不同,但是目的和作用是一样的,比如在mysql里数据字典是在information_schema 里表现的,sqlserver则是在sys这个系统schema里来展示的。
Oracle的数据字典是Oracle数据库安装之后,自动创建的一系列数据库对象。数据字典是Oracle数据库对象结构的元数据信息。熟悉和深入研究数据字典对象,可以很大程度的帮助我们了解Oracle内部机制。
Oracle字典视图包括四个层次,分别为X$内部表、基础数据字典表、数据字典视图和动态性能视图。

数 据字典表和用户创建的表没有什么区别,不过数据字典表里的数据是Oracle系统存放的系统数据,而普通表存放的是用户的数据而已,为了方便的区别这些 表,这些表的名字都是用"$"结尾,在我们看到的sql语句里看到"$"结尾的这些表,大家就可以想到这可能是一个数据字典表了,同样,既然如此,我们创 建自己的用户表的时候就不要用“$”结尾,以免让别人误会,数据字典表是系统存放系统用户的,所以他的owner是sys,在手工用create database的命令的时候,会调用$ORACLE_HOME/rdbms/admin/sql.bsq文件,这个就会执行生成我们这些数据字典表。打 开sql.bsq会发现很多数据字典几乎都以$结尾,比如col$,tab$等。

对于数据字典表,里面的数据是有数据库系统自身来维护 的,所以这里虽然和普通表一样可以用DML语句来修改数据内容,但是大家最好还是不要自己来做了,因为这些表都是作用于数据库内部的,我们有时看到的 604的的recursive sql这里的sql实际上很有可能就是我们的相关的数据字典表的执行内容。所以这里我们切记记住不要去修改这些表里的内容。

刚才说道了。 这里的数据字典表的用户都是sys,存在在system这个表空间里,表名都用"$"结尾,为了便于用户对数据字典表的查询,这样的名字是不利于我们记忆 的,所以Oracle对这些数据字典都分别建立了用户视图视图,不仅有更容易接受的名字,还隐藏了数据字典表表之间的关系,让我们字节通过视图来进行查 询,简单而形象,Oracle针对这些对象的范围,分别把视图命名为DBA_XXXX, ALL_XXXX和USER_XXXX

user_对象视图:描述了当前用户schema下的对象;
all_对象视图:描述了当前用户有权限访问到的所有对象的信息;
dba_对象视图:包括了所有数据库对象的信息;

注 意:在创建数据库是会运行两个脚本。先运行catalog.sql,该脚本用来创建数据库的内部字典表。然后再运行catrpoc.sql,该脚本用来创 建数据库内建的存储过程、包等pl\sql对象。如果我们是使用dbca来创建数据库,则dbca会自动调用这两个脚本。否则在执行create database命令来创建时,则需要手工运行这两个脚本。

追踪数据字典 

数 据字典视图非常多,我们无法一一记住,但是有个视图,我们必须知道,那就是dictionary视图,该视图里记录了所有的数据字典视图的名称。所以当我 们需要查找某个数据字典而又不知道这个信息在哪个视图里的时候,就可以在dictionary视图里找。该视图还有个同名词dict。下面我们来追踪下 dba_synonyms

SQL> desc dict
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TABLE_NAME                                         VARCHAR2(30)
 COMMENTS                                           VARCHAR2(4000)

SQL> select table_name from dict where table_name like'%SYNONYM%';

TABLE_NAME
------------------------------
DBA_SYNONYMS
USER_SYNONYMS
ALL_SYNONYMS

在DBA_SYNONYMS验证下dba_synonyms是否为同名词

SQL>select OWNER,SYNONYM_NAME,TABLE_NAME from dba_synonyms where SYNONYM_NAME='DBA_SYNONYMS'

OWNER                          SYNONYM_NAME                   TABLE_NAME
------------------------------ ------------------------------ ------------------------------
PUBLIC                         DBA_SYNONYMS                   DBA_SYNONYMS

果然,DBA_SYNONYMS为

Oracle数据字典概述 

数据库是数据的集合, 数据库维护和管理这用户的数据,那么这些用户数据表都存在哪里,用户的信息是怎样的,存储这些用户的数据的路径在哪里,这些信息不属于用户的信息,却是数 据库维护和管理用户数据的核心,这些信息就是数据库的数据字典来维护的,数据库的数据字典就汇集了这些数据库运行所需要的基础信息叻。每个数据库都提供了 各自的数据字典的方案,虽然形式不同,但是目的和作用是一样的,比如在mysql里数据字典是在information_schema 里表现的,sqlserver则是在sys这个系统schema里来展示的。
Oracle的数据字典是Oracle数据库安装之后,自动创建的一系列数据库对象。数据字典是Oracle数据库对象结构的元数据信息。熟悉和深入研究数据字典对象,可以很大程度的帮助我们了解Oracle内部机制。
Oracle字典视图包括四个层次,分别为X$内部表、基础数据字典表、数据字典视图和动态性能视图。

数 据字典表和用户创建的表没有什么区别,不过数据字典表里的数据是Oracle系统存放的系统数据,而普通表存放的是用户的数据而已,为了方便的区别这些 表,这些表的名字都是用"$"结尾,在我们看到的sql语句里看到"$"结尾的这些表,大家就可以想到这可能是一个数据字典表了,同样,既然如此,我们创 建自己的用户表的时候就不要用“$”结尾,以免让别人误会,数据字典表是系统存放系统用户的,所以他的owner是sys,在手工用create database的命令的时候,会调用$ORACLE_HOME/rdbms/admin/sql.bsq文件,这个就会执行生成我们这些数据字典表。打 开sql.bsq会发现很多数据字典几乎都以$结尾,比如col$,tab$等。

对于数据字典表,里面的数据是有数据库系统自身来维护 的,所以这里虽然和普通表一样可以用DML语句来修改数据内容,但是大家最好还是不要自己来做了,因为这些表都是作用于数据库内部的,我们有时看到的 604的的recursive sql这里的sql实际上很有可能就是我们的相关的数据字典表的执行内容。所以这里我们切记记住不要去修改这些表里的内容。

刚才说道了。 这里的数据字典表的用户都是sys,存在在system这个表空间里,表名都用"$"结尾,为了便于用户对数据字典表的查询,这样的名字是不利于我们记忆 的,所以Oracle对这些数据字典都分别建立了用户视图视图,不仅有更容易接受的名字,还隐藏了数据字典表表之间的关系,让我们字节通过视图来进行查 询,简单而形象,Oracle针对这些对象的范围,分别把视图命名为DBA_XXXX, ALL_XXXX和USER_XXXX

user_对象视图:描述了当前用户schema下的对象;
all_对象视图:描述了当前用户有权限访问到的所有对象的信息;
dba_对象视图:包括了所有数据库对象的信息;

注 意:在创建数据库是会运行两个脚本。先运行catalog.sql,该脚本用来创建数据库的内部字典表。然后再运行catrpoc.sql,该脚本用来创 建数据库内建的存储过程、包等pl\sql对象。如果我们是使用dbca来创建数据库,则dbca会自动调用这两个脚本。否则在执行create database命令来创建时,则需要手工运行这两个脚本。

追踪数据字典 

数 据字典视图非常多,我们无法一一记住,但是有个视图,我们必须知道,那就是dictionary视图,该视图里记录了所有的数据字典视图的名称。所以当我 们需要查找某个数据字典而又不知道这个信息在哪个视图里的时候,就可以在dictionary视图里找。该视图还有个同名词dict。下面我们来追踪下 dba_synonyms

SQL> desc dict
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TABLE_NAME                                         VARCHAR2(30)
 COMMENTS                                           VARCHAR2(4000)

SQL> select table_name from dict where table_name like'%SYNONYM%';

TABLE_NAME
------------------------------
DBA_SYNONYMS
USER_SYNONYMS
ALL_SYNONYMS

在DBA_SYNONYMS验证下dba_synonyms是否为同名词

SQL>select OWNER,SYNONYM_NAME,TABLE_NAME from dba_synonyms where SYNONYM_NAME='DBA_SYNONYMS'

OWNER                          SYNONYM_NAME                   TABLE_NAME
------------------------------ ------------------------------ ------------------------------
PUBLIC                         DBA_SYNONYMS                   DBA_SYNONYMS

果然,DBA_SYNONYMS为DBA_SYNONYMS表的同名词。

继续查找dba_objects验证DBA_SYNONYMS为何种对象。

SQL>select OWNER,OBJECT_NAME,OBJECT_TYPE from dba_objects where OBJECT_NAME='DBA_SYNONYMS'

OWNER                          OBJECT_NAME        OBJECT_TYPE
------------------------------ ------------------ -------------------
SYS                            DBA_SYNONYMS        VIEW
PUBLIC                         DBA_SYNONYMS       SYNONYM

可以看出,DBA_SYNONYMS为sys用户下的视图,继续查找,dba_views查看

Oracle数据字典概述 

数据库是数据的集合, 数据库维护和管理这用户的数据,那么这些用户数据表都存在哪里,用户的信息是怎样的,存储这些用户的数据的路径在哪里,这些信息不属于用户的信息,却是数 据库维护和管理用户数据的核心,这些信息就是数据库的数据字典来维护的,数据库的数据字典就汇集了这些数据库运行所需要的基础信息叻。每个数据库都提供了 各自的数据字典的方案,虽然形式不同,但是目的和作用是一样的,比如在mysql里数据字典是在information_schema 里表现的,sqlserver则是在sys这个系统schema里来展示的。
Oracle的数据字典是Oracle数据库安装之后,自动创建的一系列数据库对象。数据字典是Oracle数据库对象结构的元数据信息。熟悉和深入研究数据字典对象,可以很大程度的帮助我们了解Oracle内部机制。
Oracle字典视图包括四个层次,分别为X$内部表、基础数据字典表、数据字典视图和动态性能视图。

数 据字典表和用户创建的表没有什么区别,不过数据字典表里的数据是Oracle系统存放的系统数据,而普通表存放的是用户的数据而已,为了方便的区别这些 表,这些表的名字都是用"$"结尾,在我们看到的sql语句里看到"$"结尾的这些表,大家就可以想到这可能是一个数据字典表了,同样,既然如此,我们创 建自己的用户表的时候就不要用“$”结尾,以免让别人误会,数据字典表是系统存放系统用户的,所以他的owner是sys,在手工用create database的命令的时候,会调用$ORACLE_HOME/rdbms/admin/sql.bsq文件,这个就会执行生成我们这些数据字典表。打 开sql.bsq会发现很多数据字典几乎都以$结尾,比如col$,tab$等。

对于数据字典表,里面的数据是有数据库系统自身来维护 的,所以这里虽然和普通表一样可以用DML语句来修改数据内容,但是大家最好还是不要自己来做了,因为这些表都是作用于数据库内部的,我们有时看到的 604的的recursive sql这里的sql实际上很有可能就是我们的相关的数据字典表的执行内容。所以这里我们切记记住不要去修改这些表里的内容。

刚才说道了。 这里的数据字典表的用户都是sys,存在在system这个表空间里,表名都用"$"结尾,为了便于用户对数据字典表的查询,这样的名字是不利于我们记忆 的,所以Oracle对这些数据字典都分别建立了用户视图视图,不仅有更容易接受的名字,还隐藏了数据字典表表之间的关系,让我们字节通过视图来进行查 询,简单而形象,Oracle针对这些对象的范围,分别把视图命名为DBA_XXXX, ALL_XXXX和USER_XXXX

user_对象视图:描述了当前用户schema下的对象;
all_对象视图:描述了当前用户有权限访问到的所有对象的信息;
dba_对象视图:包括了所有数据库对象的信息;

注 意:在创建数据库是会运行两个脚本。先运行catalog.sql,该脚本用来创建数据库的内部字典表。然后再运行catrpoc.sql,该脚本用来创 建数据库内建的存储过程、包等pl\sql对象。如果我们是使用dbca来创建数据库,则dbca会自动调用这两个脚本。否则在执行create database命令来创建时,则需要手工运行这两个脚本。

追踪数据字典 

数 据字典视图非常多,我们无法一一记住,但是有个视图,我们必须知道,那就是dictionary视图,该视图里记录了所有的数据字典视图的名称。所以当我 们需要查找某个数据字典而又不知道这个信息在哪个视图里的时候,就可以在dictionary视图里找。该视图还有个同名词dict。下面我们来追踪下 dba_synonyms

SQL> desc dict
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TABLE_NAME                                         VARCHAR2(30)
 COMMENTS                                           VARCHAR2(4000)

SQL> select table_name from dict where table_name like'%SYNONYM%';

TABLE_NAME
------------------------------
DBA_SYNONYMS
USER_SYNONYMS
ALL_SYNONYMS

在DBA_SYNONYMS验证下dba_synonyms是否为同名词

SQL>select OWNER,SYNONYM_NAME,TABLE_NAME from dba_synonyms where SYNONYM_NAME='DBA_SYNONYMS'

OWNER                          SYNONYM_NAME                   TABLE_NAME
------------------------------ ------------------------------ ------------------------------
PUBLIC                         DBA_SYNONYMS                   DBA_SYNONYMS

果然,DBA_SYNONYMS为

Oracle数据字典概述 

数据库是数据的集合, 数据库维护和管理这用户的数据,那么这些用户数据表都存在哪里,用户的信息是怎样的,存储这些用户的数据的路径在哪里,这些信息不属于用户的信息,却是数 据库维护和管理用户数据的核心,这些信息就是数据库的数据字典来维护的,数据库的数据字典就汇集了这些数据库运行所需要的基础信息叻。每个数据库都提供了 各自的数据字典的方案,虽然形式不同,但是目的和作用是一样的,比如在mysql里数据字典是在information_schema 里表现的,sqlserver则是在sys这个系统schema里来展示的。
Oracle的数据字典是Oracle数据库安装之后,自动创建的一系列数据库对象。数据字典是Oracle数据库对象结构的元数据信息。熟悉和深入研究数据字典对象,可以很大程度的帮助我们了解Oracle内部机制。
Oracle字典视图包括四个层次,分别为X$内部表、基础数据字典表、数据字典视图和动态性能视图。

数 据字典表和用户创建的表没有什么区别,不过数据字典表里的数据是Oracle系统存放的系统数据,而普通表存放的是用户的数据而已,为了方便的区别这些 表,这些表的名字都是用"$"结尾,在我们看到的sql语句里看到"$"结尾的这些表,大家就可以想到这可能是一个数据字典表了,同样,既然如此,我们创 建自己的用户表的时候就不要用“$”结尾,以免让别人误会,数据字典表是系统存放系统用户的,所以他的owner是sys,在手工用create database的命令的时候,会调用$ORACLE_HOME/rdbms/admin/sql.bsq文件,这个就会执行生成我们这些数据字典表。打 开sql.bsq会发现很多数据字典几乎都以$结尾,比如col$,tab$等。

对于数据字典表,里面的数据是有数据库系统自身来维护 的,所以这里虽然和普通表一样可以用DML语句来修改数据内容,但是大家最好还是不要自己来做了,因为这些表都是作用于数据库内部的,我们有时看到的 604的的recursive sql这里的sql实际上很有可能就是我们的相关的数据字典表的执行内容。所以这里我们切记记住不要去修改这些表里的内容。

刚才说道了。 这里的数据字典表的用户都是sys,存在在system这个表空间里,表名都用"$"结尾,为了便于用户对数据字典表的查询,这样的名字是不利于我们记忆 的,所以Oracle对这些数据字典都分别建立了用户视图视图,不仅有更容易接受的名字,还隐藏了数据字典表表之间的关系,让我们字节通过视图来进行查 询,简单而形象,Oracle针对这些对象的范围,分别把视图命名为DBA_XXXX, ALL_XXXX和USER_XXXX

user_对象视图:描述了当前用户schema下的对象;
all_对象视图:描述了当前用户有权限访问到的所有对象的信息;
dba_对象视图:包括了所有数据库对象的信息;

注 意:在创建数据库是会运行两个脚本。先运行catalog.sql,该脚本用来创建数据库的内部字典表。然后再运行catrpoc.sql,该脚本用来创 建数据库内建的存储过程、包等pl\sql对象。如果我们是使用dbca来创建数据库,则dbca会自动调用这两个脚本。否则在执行create database命令来创建时,则需要手工运行这两个脚本。

追踪数据字典 

数 据字典视图非常多,我们无法一一记住,但是有个视图,我们必须知道,那就是dictionary视图,该视图里记录了所有的数据字典视图的名称。所以当我 们需要查找某个数据字典而又不知道这个信息在哪个视图里的时候,就可以在dictionary视图里找。该视图还有个同名词dict。下面我们来追踪下 dba_synonyms

SQL> desc dict
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TABLE_NAME                                         VARCHAR2(30)
 COMMENTS                                           VARCHAR2(4000)

SQL> select table_name from dict where table_name like'%SYNONYM%';

TABLE_NAME
------------------------------
DBA_SYNONYMS
USER_SYNONYMS
ALL_SYNONYMS

在DBA_SYNONYMS验证下dba_synonyms是否为同名词

SQL>select OWNER,SYNONYM_NAME,TABLE_NAME from dba_synonyms where SYNONYM_NAME='DBA_SYNONYMS'

OWNER                          SYNONYM_NAME                   TABLE_NAME
------------------------------ ------------------------------ ------------------------------
PUBLIC                         DBA_SYNONYMS                   DBA_SYNONYMS

果然,DBA_SYNONYMS为

Oracle数据字典概述 

数据库是数据的集合, 数据库维护和管理这用户的数据,那么这些用户数据表都存在哪里,用户的信息是怎样的,存储这些用户的数据的路径在哪里,这些信息不属于用户的信息,却是数 据库维护和管理用户数据的核心,这些信息就是数据库的数据字典来维护的,数据库的数据字典就汇集了这些数据库运行所需要的基础信息叻。每个数据库都提供了 各自的数据字典的方案,虽然形式不同,但是目的和作用是一样的,比如在mysql里数据字典是在information_schema 里表现的,sqlserver则是在sys这个系统schema里来展示的。
Oracle的数据字典是Oracle数据库安装之后,自动创建的一系列数据库对象。数据字典是Oracle数据库对象结构的元数据信息。熟悉和深入研究数据字典对象,可以很大程度的帮助我们了解Oracle内部机制。
Oracle字典视图包括四个层次,分别为X$内部表、基础数据字典表、数据字典视图和动态性能视图。

数 据字典表和用户创建的表没有什么区别,不过数据字典表里的数据是Oracle系统存放的系统数据,而普通表存放的是用户的数据而已,为了方便的区别这些 表,这些表的名字都是用"$"结尾,在我们看到的sql语句里看到"$"结尾的这些表,大家就可以想到这可能是一个数据字典表了,同样,既然如此,我们创 建自己的用户表的时候就不要用“$”结尾,以免让别人误会,数据字典表是系统存放系统用户的,所以他的owner是sys,在手工用create database的命令的时候,会调用$ORACLE_HOME/rdbms/admin/sql.bsq文件,这个就会执行生成我们这些数据字典表。打 开sql.bsq会发现很多数据字典几乎都以$结尾,比如col$,tab$等。

对于数据字典表,里面的数据是有数据库系统自身来维护 的,所以这里虽然和普通表一样可以用DML语句来修改数据内容,但是大家最好还是不要自己来做了,因为这些表都是作用于数据库内部的,我们有时看到的 604的的recursive sql这里的sql实际上很有可能就是我们的相关的数据字典表的执行内容。所以这里我们切记记住不要去修改这些表里的内容。

刚才说道了。 这里的数据字典表的用户都是sys,存在在system这个表空间里,表名都用"$"结尾,为了便于用户对数据字典表的查询,这样的名字是不利于我们记忆 的,所以Oracle对这些数据字典都分别建立了用户视图视图,不仅有更容易接受的名字,还隐藏了数据字典表表之间的关系,让我们字节通过视图来进行查 询,简单而形象,Oracle针对这些对象的范围,分别把视图命名为DBA_XXXX, ALL_XXXX和USER_XXXX

user_对象视图:描述了当前用户schema下的对象;
all_对象视图:描述了当前用户有权限访问到的所有对象的信息;
dba_对象视图:包括了所有数据库对象的信息;

注 意:在创建数据库是会运行两个脚本。先运行catalog.sql,该脚本用来创建数据库的内部字典表。然后再运行catrpoc.sql,该脚本用来创 建数据库内建的存储过程、包等pl\sql对象。如果我们是使用dbca来创建数据库,则dbca会自动调用这两个脚本。否则在执行create database命令来创建时,则需要手工运行这两个脚本。

追踪数据字典 

数 据字典视图非常多,我们无法一一记住,但是有个视图,我们必须知道,那就是dictionary视图,该视图里记录了所有的数据字典视图的名称。所以当我 们需要查找某个数据字典而又不知道这个信息在哪个视图里的时候,就可以在dictionary视图里找。该视图还有个同名词dict。下面我们来追踪下 dba_synonyms

SQL> desc dict
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 TABLE_NAME                                         VARCHAR2(30)
 COMMENTS                                           VARCHAR2(4000)

SQL> select table_name from dict where table_name like'%SYNONYM%';

TABLE_NAME
------------------------------
DBA_SYNONYMS
USER_SYNONYMS
ALL_SYNONYMS

在DBA_SYNONYMS验证下dba_synonyms是否为同名词

SQL>select OWNER,SYNONYM_NAME,TABLE_NAME from dba_synonyms where SYNONYM_NAME='DBA_SYNONYMS'

OWNER                          SYNONYM_NAME                   TABLE_NAME
------------------------------ ------------------------------ ------------------------------
PUBLIC                         DBA_SYNONYMS                   DBA_SYNONYMS

果然,DBA_SYNONYMS为DBA_SYNONYMS表的同名词。

继续查找dba_objects验证DBA_SYNONYMS为何种对象。

SQL>select OWNER,OBJECT_NAME,OBJECT_TYPE from dba_objects where OBJECT_NAME='DBA_SYNONYMS'

OWNER                          OBJECT_NAME        OBJECT_TYPE
------------------------------ ------------------ -------------------
SYS                            DBA_SYNONYMS        VIEW
PUBLIC                         DBA_SYNONYMS       SYNONYM

可以看出,DBA_SYNONYMS为sys用户下的视图,继续查找,dba_views查看DBA_SYNONYMS的具体定义。

SQL> select VIEW_NAME,TEXT from dba_views where VIEW_NAME='DBA_SYNONYMS';

VIEW_NAME
------------------------------
TEXT
--------------------------------------------------------------------------------
DBA_SYNONYMS
select u.name, o.name, s.owner, s.name, s.node
from sys.user$ u, sys.syn$ s, sys

可以看到,DBA_SYNONYMS是基于sys用户下的user$和syn$这两张数据字典表创建的视图。

这里也就验证了,我们前面所说的数据字典组织方式:先基于数据字典创建数据字典视图,然后在基于数据字典视图创建同名词,并将该同名词赋给了PUBLIC,从而是得所有用户都可以通过同名词查看数据字典信息。

动态性能视图概述

所谓动态性能视图,就是指将内存里的数据或控制文件里的数据以表的形式展现出来。他们实际都是需表,并不是真正的表。只不过是为了能够让我们更好的管理数据库的性能,所以将内存里的活动情况以表的形式展现出来。只要数据库还在运行,就会不断更新动态性能视图。一旦数据库关闭或崩溃,动态性能视图里的数据就会全部丢失,下次重启时则会重新计算。就像所有的数据字典的名词都存在dictionary里一样,v$fixed_table里存放了所有的动态性能视图的名称。所有的动态性能的属主都是sys,且都以v$_开头,创建同名词时则都以v$开头。

追踪动态性能视图 

下面以v$session为例进行追踪

SQL> select OWNER,SYNONYM_NAME,TABLE_NAME from dba_synonyms where SYNONYM_NAME='V$SESSION';

OWNER                          SYNONYM_NAME                   TABLE_NAME
------------------------------ ------------------------------ ------------------------------
PUBLIC                         V$SESSION                         V_$SESSION 
查看V_$SESSION的对象类型和属主

SQL> select OWNER,OBJECT_NAME,OBJECT_TYPE from dba_objects where OBJECT_NAME='V_$SESSION';

OWNER                          OBJECT_NAME        OBJECT_TYPE
------------------------------ ------------------ -------------------
SYS                            V_$SESSION         VIEW 
这里可以知道V_$SESSION是视图,查看该视图的具体定义。

SQL>select TEXT from dba_views where VIEW_NAME='V_$SESSION'

TEXT
--------------------------------------------------------------------------------
select "SADDR","SID","SERIAL#","AUDSID","PADDR","USER#","USERNAME","COMMAND","OW

....................................................... 
,"WAIT_TIME","SECONDS_IN_WAIT","STATE","SERVICE_NAME","SQL_TRACE","SQL_TRACE_WAI
TS","SQL_TRACE_BINDS" from v$session 

可以看到v_$session视图是基于与动态性能视图v$session视图创建的,而动态性能视图的定义信息记录在v$fixed_view_definition里面

SQL> select VIEW_DEFINITION from v$fixed_view_definition where VIEW_NAME='V$SESSION';

VIEW_DEFINITION
------------------------------------------------------------------------------------------------------------------------------------------------------
select  SADDR , SID , SERIAL# , AUDSID , PADDR , USER# , USERNAME , COMMAND , OWNERID, TADDR , LOCKWAIT , STATUS , SERVER , SCHEMA# , SCHEMANAME ,OSUS
.......................................................

WAIT_CLASS#,WAIT_CLASS,WAIT_TIME, SECONDS_IN_WAIT,STATE,SERVICE_NAME, SQL_TRACE, SQL_
TRACE_WAITS, SQL_TRACE_BINDS from GV$SESSION where inst_id = USERENV('Instance')

可以看到动态性能视图v$session是基于动态性能视图gv$session视图创建的,继续追踪

select VIEW_DEFINITION from v$fixed_view_definition where VIEW_NAME='GV$SESSION'
SQL> /

VIEW_DEFINITION
------------------------------------------------------------------------------------------------------------------------------------------------------
select s.inst_id,s.addr,s.indx,s.ksuseser,s.ksuudses,s.ksusepro,s.ksuudlui,s.ksuudlna,s.ksuudoct,s.ksusesow, decode(s.ksusetrn,hextoraw('00'),null,s.k
.......................................................
ED KNOWN TIME')),s.ksusesvc, decode(bitand(s.ksuseflg2,32),32,'ENABLED','DISABLED'),decode(bitand(s.ksuseflg2,64),64,'TRUE','FALSE'),decode(bitand(s.k
suseflg2,128),128,'TRUE','FALSE')from x$ksuse s, x$ksled e where bitand(s.ksspaflg,1)!=0 and bitand(s.ksuseflg,1)!=0 and s.ksuseopc=e.indx 
可以看到gv$session是的最终定义信息是来自于x$ksuse s和x$ksle,这些表是动态性能视图的机表。但是这些表都是内存表,表中的数据不会存在数据文件中,只存在内存中。

 

参考至:《教你成为10g OCP》韩思捷著

            《深入了解Oracle数据字典》盖国强著

             http://club.topsage.com/thread-601580-1-1.html

             http://space.itpub.net/17203031/viewspace-686814

posted @ 2017-04-14 16:49  dudu_java  阅读(1131)  评论(0编辑  收藏  举报