Oracle 数据字典视图(V$,GV$,X$) #

来源:互联网 发布:听音乐软件 编辑:程序博客网 时间:2024/04/16 20:02

1、常用的几个数据字典:

user_objects : 记录了用户的所有对象,包含表、索引、过程、视图等信息,以及创建时间,状态是否有效等信息,是非DBA用户的大本营。想知道自己有哪些对象,往这里查。

user_source :包含了系统中对象的原码,如存储过程,FUNCTION、PROCEDURE、PACKAGE等信息

cat或Tab :包含当前用户所有的用户和视图信息和同义词信息,cat还多了一个SYNONYM;

dict :系统中所有的数据字典都存储在这里面
 
Oracle中的数据字典有静态和动态之分。

静态数据字典主要是在用户访问数据字典时不会发生改变的,但动态数据字典是依赖数据库运行的性能的,反映数据库运行的一些内在信息,所以在访问这类数据字典时往往不是一成不变的。以下分别就这两类数据字典来论述。


a:静态数据字典视图名一般用复数,而动态性能视图名一般用单数,比如dba_tablepsaces vs v$tablespace。
b:静态数据字典视图只有在数据库open的情况下才可以访问,而部分动态性能视图可以在数据库非open状态下使用。
c:静态数据字典视图里看到的列信息一般都是大写,而动态性能视图里看到的一般都是小写。
d:静态数据字典视图里的信息是静态的,在数据库关闭后不丢失;而动态性能视图里的信息是动态的,关闭instance后信息丢失。
获取动态性能视图的定义:select * from V_$FIXED_VIEW_DEFINITION;
获取静态数据字典视图的定义:select * from dba_views where view_name='DBA_TABLES'; 
select dbms_metadata.get_ddl('VIEW','DBA_TABLES') from dual;
在Oracle 10g中,也可以通过EM来显示metadata information。


2、 静态数据字典

这类数据字典主要是由表和视图组成,应该注意的是,数据字典中的表是不能直接被访问的,但是可以访问数据字典中的视图。静态数据字典中的视图分为三类,它们分别由三个前缀够成:user_*、 all_*、 dba_*。

user_*
该视图存储了关于当前用户所拥有的对象的信息。(即所有在该用户模式下的对象)

all_*

该试图存储了当前用户能够访问的对象的信息。(与user_*相比,all_* 并不需要拥有该对象,只需要具有访问该对象的权限即可)

dba_*

该视图存储了数据库中所有对象的信息。(前提是当前用户具有访问这些数据库的权限,一般来说必须具有管理员权限)

从上面的描述可以看出,三者之间存储的数据肯定会有重叠,其实它们除了访问范围的不同以外(因为权限不一样,所以访问对象的范围不一样),其他均具有一致性。具体来说,由于数据字典视图是由SYS(系统用户)所拥有的,所以在却省情况下,只有SYS和拥有DBA系统权限的用户可以看到所有的视图。没有DBA权限的用户只能看到user_*和all_*视。如果没有被授予相关的SELECT权限的话,他们是不能看到 dba_*视图的。

由于三者具有相似性,下面以user_为例介绍几个常用的静态视图:

user_users视图

主要描述当前用户的信息,主要包括当前用户名、帐户id、帐户状态、表空间名、创建时间等。例如执行下列命令即可返回这些信息。
select * from user_users

user_tables视图

主要描述当前用户拥有的所有表的信息,主要包括表名、表空间名、簇名等。通过此视图可以清楚了解当前用户可以操作的表有哪些。执行命令为:select * from user_tables

user_objects视图

  主要描述当前用户拥有的所有对象的信息,对象包括表、视图、存储过程、触发器、包、索引、序列等。该视图比user_tables视图更加全面。例如, 需要获取一个名为“package1”的对象类型和其状态的信息,可以执行下面命令:

select object_type,status  from user_objects
where object_name=upper(‘package1’);


  这里需注意upper的使用,数据字典里的所有对象均为大写形式,而PL/SQL里不是大小写敏感的,所以在实际操作中一定要注意大小写匹配。

user_tab_privs视图

  该视图主要是存储当前用户下对所有表的权限信息。比如,为了了解当前用户对table1的权限信息,可以执行如下命令:

select * from user_tab_privs where table_name=upper('table1')

 

  了解了当前用户对该表的权限之后就可以清楚的知道,哪些操作可以执行,哪些操作不能执行。

  前面的视图均为user_开头的,其实all_开头的也完全是一样的,只是列出来的信息是当前用户可以访问的对象而不是当前用户拥有的对象。对于dba_开头的需要管理员权限,其他用法也完全一样,这里就不再赘述了。

3、 动态数据字典

  Oracle包含了一些潜在的由系统管理员如SYS维护的表和视图,由于当数据库运行的时候它们会不断进行更新,所以称它们为动态数据字典(或者是动态性能视图)。这些视图提供了关于内存和磁盘的运行情况,所以我们只能对其进行只读访问而不能修改它们。

  Oracle中这些动态性能视图都是以v$开头的视图,比如v$access。下面就几个主要的动态性能视图进行介绍。

v$access

  该视图显示数据库中锁定的数据库对象以及访问这些对象的会话对象(session对象)。

  运行如下命令:

select * from v$access

  结果如下:(因记录较多,故这里只是节选了部分记录)

SID OWNER OBJECT TYPE 
27 DKH V$ACCESS CURSOR 
27 PUBLIC V$ACCESS SYNONYM 
27 SYS DBMS_APPLICATION_INFO PACKAGE 
27 SYS GV$ACCESS VIEW

v$session

  该视图列出当前会话的详细信息。由于该视图字段较多,这里就不列详细字段,为了解详细信息,可以直接在sql*plus命令行下键入:desc v$session即可。

v$active_instance

  该视图主要描述当前数据库下的活动的实例的信息。依然可以使用select语句来观察该信息。

v$context

  该视图列出当前会话的属性信息。比如命名空间、属性值等。

常用的数据字典是要掌握的,如表空间、各种对象、会话等。个人认为一般知道自己需要时往哪里找这些信息才是最重要的,然后通过关键字查找。
 

动态性能视图在数据库打开和使用时不断进行更新,而且它们的内容主要与性能有关。虽然这些视图很像普通的数据库表,但它们不允许用户直接进行修改。这些视图提供内部磁盘结构和内存结构方面的数据。用户可以对这些视图进行查询,以便对系统进行管理与优化。

 

CATALOG.SQL 文件包含这些视图的定义以及公用同义词,必须运行CATALOG.SQL 创建这些视图及同义词。升级系统也后要执行这个脚本.

 

当数据库管理员启动某个例程时,数据库会自动建立动态性能视图;

停止某个例程时,数据库又会自动删除这些动态性能视图

 

 数据字典的信息是从数据文件中取得而动态性能视图的信息则是从SGA内存以及控制文件中取得。所以,两者所反映的信息还是有很大差异的。数据库管理员利用这些动态性能视图,可以了解数据库运行的一些基本信息,为我们进行数据库维护以及数据库性能优化提供一些数据上的支持。

 

一般情况下,我们可以通过动态性能数据掌握两类重要的数据库运行信息

(1)了解数据库运行相关的性能数据,如内存的使用量、磁盘排序发生的机率等等。

(2)取得与磁盘和内存结构相关的其他信息。

 

在通常情况下,数据库不同的状态其动态性能视图还是有比较大的差异

 

1)数据库处于“NOMOUNT”状态。数据库启动例程时,Oracle数据库会打开参数文件,分配SGA内存并启动后台进程。此时,其实数据库还没有挂栽。此时,动态性能视图收集的信息来源只有是SGA,而不会从控制文件中收集相关的信息。所以,动态性能视图的数量要少得多。


2)当数据库处于MOUNT状态时,数据库会根据初始化参数打开所有的控制文件。所以,当例程处于Mount状态时,动态性能视图其收集到的信息就要第一个状态多的多。因为此时,动态性能视图还会去收集控制文件的相关信息。不过,此时动态性能视图所收集到的资料还不是最全的。


3)当用户打开数据库时,Oracle系统会根据控制文件所记载的信息去打开所有的数据库文件以及重做日志。此时,数据库管理员除了可以从 SGA和控制文件中获取信息的动态性能视图外,还可能访问与Oracle数据库性能相关的动态性能视图,如会话等待时间等视图。另外需要注意一点,就是只有在这个状态时,我们才能够访问数据库的数据字典视图。

SYS owns the dynamic performance tables, whose names begin with V_$. Views are created on these tables, and then public synonyms prefixed withV$. For example, the V$DATAFILE view contains information about data files. The V$FIXED_TABLE view contains information about all of the dynamic performance tables and views.

 

从这段描述里,我们可以理解,通过V$FIXED_TBLE 视图可以查看几乎所有的动态性能表和视图。 V$是V_$的同义词。


 
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.2.1  X$ 表

X$表包含了特定实例的各方面的信息,是Oracle数据库的运行基础,如当前的配置信息,连接到实例的会话,以及丰富而有价值的性能信息。 X$表并不是驻留在数据库文件的永久表或临时表。

X$表仅仅驻留在内存中,当实例启动时,由Oracle应用程序动态创建,在内存中进行实时的维护。 它们中的大多数至少需要装载或已经打开的数据库。X$表为SYS用户所拥有,并且是只读的。 不能进行DML(更新,插入,删除)X$表对数据库来说至关重要,所以Oracle不允许SYSDBA之外的用户直接访问,显示授权不被允许

如果显示授权你会收到如下错误: 
  
SQL> grant select on x$ksppi to eygle; 
grant select on x$ksppi to eygle 
                * 
ERROR at line 1: 
ORA-02030: can only select from fixed tables/views 

可以从v$fixed_table中查到X$:
SQL>  select count(*) from v$fixed_table where name like 'X$%';

  COUNT(*)

----------

    945               ————我的数据库10g里大概有613个X$表。

在Oracle 11g共有945个X$表。

 

关于X$表,其创建信息我们也可以通过bootstrap$表查看,该表中记录了数据库启动的基本及驱动信息。

 

bootstrap$ 实际上存储的是数据字典的基表的定义,如OBJ$,C_OBJ$,TAB$等等。Oracle通过读取这些定义创建数据字典的基表,进而创建数据字典。

 

SQL> select * from bootstrap$;

bootstrap$ 部分比较深,有空在研究。

 

 

1.2.2  GV$ V$ 同义词

 

1.2.2.1  V$ 视图

动态性能视图由前缀V_$标识。这些视图的公用同义词具有前缀V$。数据库管理员或用户应该只访问V$对象,而不是访问V_$对象。动态性能视图由企业管理器和Oracle Trace 使用,Oracle Trace 是访问系统性能信息的主要界面。一旦实例启动,从内存读取数据的 V$视图就可以访问了。

 

注意: 每个V$视图都包含类似语句:

where inst_id = USERENV('Instance')

用于限制返回当前实例信息。

 

这一点我们可以通过V$FIXED_VIEW_DEFINITION 视图 来验证。如:

SQL>  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')

 

 

通过v$fixed_table 查询V$视图信息:

SQL> select count(*) from v$fixed_table where name like 'V$%';

  COUNT(*)

----------

      525

 

1.2.2.2  GV$ 视图

从Oracle8开始,GV$视图开始被引入, GV$Global V$,全局V$。除了一些特例以外(如:V$CACHE_LOCK、V$LOCK_ACTIVITY、V$LOCKS_WITH_COLLISIONS和V$ROLLNAME),每个V$视图都有一个对应的GV$视图存在。在并行服务器环境下,可查询GV$视图从所有限定实例中检索V$视图的信息。

V$视图和GV$视图是相同的,V$GV$只是少了INST_ID字段。INST_ID 列显示从其获得相关的V$视图信息的实例号。INST_ID 列可用作一个从可得到的实例集检索V$信息的过滤器。

 

如:

SQL>SELECT * FROM GV$LOCK WHERE INST_ID = 2;

表示从实例2上的V$ 视图中检索信息。

 

通过v$fixed_table 查询GV$视图信息:

SQL> select count(*) from v$fixed_table where name like 'GV$%';

  COUNT(*)

----------

       496

从查询结果看,GV$是496个,V$是525个,从这个结果可以证明:不是每个V$同义词都有对应的GV$同义词。

 

1.2.2.3  V$FIXED_VIEW_DEFINITION 视图


通过 V$FIXED_VIEW_DEFINITION 视图可以获取组成V$视图的底层X$表的所有信息。

 示例1.查看V$FIXED_TABLE 视图定义

SQL> 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')

 

从这里,我们看到V$FIXED_TABLE基于GV$FIXED_TABLE创建。

 

示例2.查看GV$FIXED_TABLE定义

SQL> 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 inst_id,kqfvinam, kqfviobj, 'VIEW', 65537 from x$kqfvi

union all select inst_id,kqfdtnam, kqfdtobj, 'TABLE', 65537 from x$kqfdt

 

从这里,我们找到了GV$FIXED_TABLE视图的创建语句,该视图基于X$表创建。

 

示例3. 研究下V$PARAMETER 视图

SQL> select view_definition from v$fixed_view_definition a where a.VIEW_NAME='V$PARAMETER';

 

VIEW_DEFINITION

-----------------------------------------------------------------------------------------------------------------------

/* Formatted on 2010/9/4 13:37:37 (QP5 v5.115.810.9015) */

SELECT   NUM,

         NAME,

         TYPE,

         VALUE,

         DISPLAY_VALUE,

         ISDEFAULT,

         ISSES_MODIFIABLE,

         ISSYS_MODIFIABLE,

         ISINSTANCE_MODIFIABLE,

         ISMODIFIED,

         ISADJUSTED,

         ISDEPRECATED,

         ISBASIC,

         DESCRIPTION,

         UPDATE_COMMENT,

         HASH

  FROM   GV$PARAMETER

 WHERE   inst_id = USERENV ('Instance')

从这里,我们看到V$PARAMETER 是基于GV$PARAMETER 构造的。

 

SQL> select view_definition from v$fixed_view_definition a where a.VIEW_NAME='GV$PARAMETER';

 

VIEW_DEFINITION

--------------------------------------------------------------------------------------------------------------------------------------------------

/* Formatted on 2010/9/4 13:38:10 (QP5 v5.115.810.9015) */

SELECT   x.inst_id,

         x.indx + 1,

         ksppinm,

         ksppity,

         ksppstvl,

         ksppstdvl,

         ksppstdf,

         DECODE (BITAND (ksppiflg / 256, 1), 1, 'TRUE', 'FALSE'),

         DECODE (BITAND (ksppiflg / 65536, 3),

                 1, 'IMMEDIATE',

                 2, 'DEFERRED',

                 3, 'IMMEDIATE',

                 'FALSE'),

         DECODE (BITAND (ksppiflg, 4),

                 4, 'FALSE',

                 DECODE (BITAND (ksppiflg / 65536, 3), 0, 'FALSE', 'TRUE')),

         DECODE (BITAND (ksppstvf, 7),

                 1, 'MODIFIED',

                 4, 'SYSTEM_MOD',

                 'FALSE'),

         DECODE (BITAND (ksppstvf, 2), 2, 'TRUE', 'FALSE'),

         DECODE (BITAND (ksppilrmflg / 64, 1), 1, 'TRUE', 'FALSE'),

         DECODE (BITAND (ksppilrmflg / 268435456, 1), 1, 'TRUE', 'FALSE'),

         ksppdesc,

         ksppstcmnt,

         ksppihash

  FROM   x$ksppi x, x$ksppcv y

 WHERE   (x.indx = y.indx) AND BITAND (ksppiflg, 268435456) = 0

         AND ( (TRANSLATE (ksppinm, '_', '#') NOT LIKE '##%')

              AND (   (TRANSLATE (ksppinm, '_', '#') NOT LIKE '#%')

                   OR (ksppstdf = 'FALSE')

                   OR (BITAND (ksppstvf, 5) > 0)))

 

在这里我们看到GV$PARAMETER来源于x$ksppi, x$ksppcv两个X$表, x$ksppi, x$ksppcv 基本上包含所有数据库可调整参数.

v$parameter展现的是不包含"_"开头的参数。以"_"开头的参数我们通常称为隐含参数,一般不建议修改,但很多因为功能强大经常使用而广为人知。

 

关于参数的更多内容参考Blog:

Oracle 参数分类  参数的查看方法

http://blog.csdn.net/tianlesoftware/archive/2010/05/13/5583655.aspx

 

 

感兴趣的,可以自己研究下V$FIXED_VIEW_DEFINITION 视图,它是我们研究数据字典的一个入口。

 

 

1.2.3  GV_$, V_$视图

动态性能的视图是通过catalog.sql创建。当catalog.sql运行时:

create or replace view v_$fixed_table as select * from v$fixed_table;

create or replace public synonym v$fixed_table for v_$fixed_table;

create or replace view gv_$fixed_table as select * from gv$fixed_table;

create or replace public synonym gv$fixed_table for gv_$fixed_table;

 

我们注意到, 先创建 V_$和GV_$ 视图,然后基于V_$视图和GV_$视图来创建V$和GV$同义词。

 

所以,实际上通常我们访问的V$视图,其实是指向V_$视图的同义词。而V_$视图是基于X$表建立的。关于这一点可以通过:v$fixed_view_definition视图 来验证。 在上面1.2.2 节有相关的示例。

 

 

访问V$FIXED_VIEW_DEFINITION 视图可以获取组成V$视图的底层X$表的所有信息

 

SQL> select count(*) from v$fixed_table where name like 'GV_%';

  COUNT(*)

----------

    496

SQL> select count(*) from v$fixed_table where name like 'V_%';

  COUNT(*)

----------

     525

 

动态性能对象那么多,如何来判断某个对象到底是同义词还是视图呢? 可以通过如下SQL来实现:

 

SQL> select object_type from all_objects where object_name=upper('v$datafile');

OBJECT_TYPE

-------------------

SYNONYM

 

 

总结一下:

                在实例启动时,会先创建X$表,然后基于X$表创建GV_$ 和 V_$ 视图,在基于GV_$ 和V_$视图创建GV$和V$同义词。 我们一般查询的都是同义词。 关于这些视图的定义,可以通过V$FIXED_VIEW_DEFINITION 视图 来查看。 在数据库运行期间,动态性能视图保存在内存中,时刻监控着数据库的状态,我们在需要的时候可以查看这些视图。 当实例关闭时,数据库又会从内存中自动删除这些动态性能视图。

 

20个常用的动态性能视图:

(1)v$sysstat  

(2)v$sesstat  

(3)v$sql & v$sql_plan  

(4)v$sqltext & v$sqlarea  

(5)v$session  

(6)v$session_wait & v$session_event  

(7)v$process  

(8)v$lock & v$locked_object  

(9)v$filestat  

(10)v$session_longops  

(11)v$latch$ v$latch_children  

(12)v$db_object_cache  

(13)v$open_cursor  

(14)v$parameter & v$system_parameter

(15)v$rollstat  

(16)v$rowcache  

(17)v$segstat & v$segment_statistics  

(18)v$system_event

(19)v$undostat  

(20)v$waitstat  

 

 

  
4.2 、GV$和V$视图
从Oracle8开始,GV$视图开始被引入,其含义为Global V$. 
除了一些特例以外,每个V$视图都有一个对应的GV$视图存在。 
  
GV$视图的产生是为了满足OPS环境的需要,在OPS环境中,查询GV$视图返回所有实例信息,而每个V$视图基于GV$视图,增加了INST_ID列判断后建立,只包含当前连接实例信息。 
  
注意,每个V$视图都包含类似语句: 
where inst_id = USERENV('Instance') 
  
用于限制返回当前实例信息。 
  
我们从GV$FIXED_TABLE和V$FIXED_TABLE开始 
  
SQL> 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') 
  
这里我们看到V$FIXED_TABLE基于GV$FIXED_TABLE创建。 
  
SQL> 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 inst_id,kqfvinam, kqfviobj, 'VIEW', 65537 from x$kqfvi 
union all 
select inst_id,kqfdtnam, kqfdtobj, 'TABLE', 65537 from x$kqfdt 
  
这样我们找到了GV$FIXED_TABLE视图的创建语句,该视图基于X$表创建。 
4.3、GV_$,V_$视图和V$,GV$同义词
这些视图是通过catalog.ql创建。 
  
当catalog.sql运行时: 
create or replace view v_$fixed_table as select * from v$fixed_table; 
create or replace public synonym v$fixed_table for v_$fixed_table; 
  
create or replace view gv_$fixed_table as select * from gv$fixed_table; 
create or replace public synonym gv$fixed_table for gv_$fixed_table; 
  
我们注意到,第一个视图V_$和GV_$首先被创建,v_$和gv_$两个视图。 
然后基于V_$视图的同义词被创建。 
  
所以,实际上通常我们访问的V$视图,其实是指向V_$视图的同义词。 
而V_$视图是基于真正的V$视图(这个视图是基于X$表建立的)。 
  
而v$fixed_view_definition视图是我们研究Oracle对象关系的一个入口,仔细理解Oracle的数据字典机制,有助于深入了解和学习Oracle数据库知识。 
  
4.4、再进一步
1.4.1    X$表
关于X$表,其创建信息我们也可以从数据字典中一窥究竟。 
首先我们考察bootstrap$表,该表中记录了数据库启动的基本及驱动信息。 
  
SQL> select * from bootstrap$; 
     LINE#       OBJ# SQL_TEXT 
------------------------------------------------------------------------------ 
        -1         -1 8.0.0.0.0 
         0          0 CREATE ROLLBACK SEGMENT SYSTEM STORAGE (  INITIAL 112K NEXT 1024K MINEXTENTS 1 M 
         8   8 CREATE CLUSTER C_FILE#_BLOCK#("TS#" NUMBER,"SEGFILE#" NUMBER,"SEGBLOCK#" NUMBER) 
         9          9 CREATE INDEX I_FILE#_BLOCK# ON CLUSTER C_FILE#_BLOCK# PCTFREE 10 INITRANS 2 MAXT 
        14         14 CREATE TABLE SEG$("FILE#" NUMBER NOT NULL,"BLOCK#" NUMBER NOT NULL,"TYPE#" NUMBE 
         5         5 CREATE TABLE CLU$("OBJ#" NUMBER NOT NULL,"DATAOBJ#" NUMBER,"TS#" NUMBER NOT NULL 
         6         6 CREATE CLUSTER C_TS#("TS#" NUMBER) PCTFREE 10 PCTUSED 40 INITRANS 2 MAXTRANS 255 
         7         7 CREATE INDEX I_TS# ON CLUSTER C_TS# PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE ( 
.... 
  
这部分信息,在数据库启动时最先被加载,跟踪数据库的启动过程,我们发现数据库启动的第一个动作就是: 
  
create table bootstrap$ ( line#         number not null,   obj# 
  number not null,   sql_text   varchar2(4000) not null)   storage (initial 
  50K objno 56 extents (file 1 block 377)) 
  
  
这部分代码是写在Oracle应用程序中的,在内存中创建了bootstrap$以后,Oracle就可以从file 1,block 377上读取其他信息,创建重要的数据库对象。从而根据这一部分信息启动数据库,这就实现了数据库的引导,类似于操作系统的初始化。 
这部分你可以参考biti_rainy的文章。 
  
X$表由此建立。这一部分表可以从v$fixed_table中查到: 
  
SQL> select count(*) from v$fixed_table where name like 'X$%'; 
  COUNT(*) 
---------- 
       394  
  
共有394个X$对象被记录。 
1.4.2    GV$和V$视图
X$表建立以后,基于X$表的GV$和V$视图得以创建。 
  
这部分视图我们也可以通过查询V$FIXED_TABLE得到。 
  
SQL> select count(*) from v$fixed_table where name like 'GV$%'; 
  COUNT(*) 
---------- 
       259 
  
这一部分共259个对象。 
  
SQL> select count(*) from v$fixed_table where name like 'V$%'; 
  COUNT(*) 
---------- 
       259  
  
同样是259个对象。 
  
v$fixed_table共记录了: 
394 + 259 + 259 共 912 个对象。 
  
我们通过V$PARAMETER视图来追踪一下数据库的架构: 
  
SQL> select view_definition from v$fixed_view_definition a where a.VIEW_NAME='V$PARAMETER'; 
VIEW_DEFINITION 
------------------------------------------------------------------------------ 
select  NUM , NAME , TYPE , VALUE , ISDEFAULT , ISSES_MODIFIABLE , ISSYS_MODIFIA 
BLE , ISMODIFIED , ISADJUSTED , DESCRIPTION, UPDATE_COMMENT from GV$PARAMETER wh 
ere inst_id = USERENV('Instance') 
  
  
我们看到V$PARAMETER是由GV$PARAMETER创建的。 
  
SQL> select view_definition from v$fixed_view_definition a where a.VIEW_NAME='GV$PARAMETER'; 
VIEW_DEFINITION 
----------------------------------------------------------------------------- 
select x.inst_id,x.indx+1,ksppinm,ksppity,ksppstvl,ksppstdf,  decode(bitand(kspp 
iflg/256,1),1,'TRUE','FALSE'),  decode(bitand(ksppiflg/65536,3),1,'IMMEDIATE',2, 
'DEFERRED',                                  3,'IMMEDIATE','FALSE'),  decode(bit 
and(ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE'),  decode(bitand(ksppstvf,2) 
,2,'TRUE','FALSE'),  ksppdesc, ksppstcmnt  from x$ksppi x, x$ksppcv y where (x.i 
ndx = y.indx) and  ((translate(ksppinm,'_','#') not like '#%') or (ksppstdf = 'F 
ALSE')) 
  
在这里我们看到GV$PARAMETER来源于x$ksppi,x$ksppcv两个X$表。 x$ksppi,x$ksppcv 基本上包含所有数据库可调整参数,v$parameter展现的是不包含"_"开头的参数。以"_"开头的参数我们通常称为隐含参数,一般不建议修改,但很多因为功能强大经常使用而广为人知。
原创粉丝点击