v$ view and v_$ view

不知道我是太较真了还是太闲了,才会写下这篇文章。

本文主要讨论一下 V$ 和 V_$开头的这些数据对象的关系。 通常来说他们的关系是这样的

V$开头的一般来说是同义词,他们通常指向同名的V_$视图,或者指向同名的V$ fixed view。比如 这是上图的前三层。它们都只反映了单实例的一些信息,所以它们一般是从GV这种数据对象中根据instance id 截取出来的,也就是后面的4-6层。

GV$开头的一般也是同义词,通常指向GV_$这样的视图或者指向同名的GV$ fixed view。这是4-6层。

而第七层是最底层是X$ 开头的fixed table。 他们是最底层的,上面6层的信息一般是从这一层得到的。说他们是table其实不太合适,他们并不是我们在普通的SQL中理解的table,他们是一种中间层。我们知道oracle的核心部分一般是c写的。 X$ FIXED TABLE 这一层的作用就是把c数据结构中的一些信息转化成我们便于理解的table形式信息的一个intermediate 层。

其实理解了上面这些就可以了,但是我对一般这个词比较敏感,总想弄的更清楚,所以做了如下实验。

首先看数据库版本

 

SQL> select * from V$VERSION;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE    10.2.0.5.0      Production
TNS for Solaris: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production

 

 

SQL> SELECT OWNER,OBJECT_TYPE,COUNT(*) FROM DBA_OBJECTS WHERE OBJECT_NAME LIKE'V$%' GROUP BY OWNER,OBJECT_TYPE;

OWNER                OBJECT_TYPE            COUNT(*)
-------------------- -------------------- ----------
SYS                  VIEW                          7
PUBLIC               SYNONYM                     413

这一步说明V$ 开头的数据对象中 有7个是view,413个是同义词。

SQL> SELECT OWNER,OBJECT_TYPE,COUNT(*) FROM DBA_OBJECTS WHERE OBJECT_NAME LIKE'V_$%' GROUP BY OWNER,OBJECT_TYPE;

OWNER                OBJECT_TYPE            COUNT(*)
-------------------- -------------------- ----------
SYS                  VIEW                        402

这一步说明V_$开头的有402个全都是view。

那么前面这413个 V$同义词和后面的402个V_$之间的map关系是什么呢?  通过下面的查询来看。

SQL> CREATE OR REPLACE VIEW MY_MAP AS
  2  SELECT DISTINCT A.OBJECT_NAME AS V$SYNONYM,  B.OBJECT_NAME AS V_$VIEW FROM DBA_OBJECTS A , DBA_OBJECTS B , DBA_SYNONYMS C
  3  WHERE
  4             A.OBJECT_NAME LIKE 'V$%' AND A.OBJECT_TYPE = 'SYNONYM'
  5  AND        A.OWNER=C.OWNER AND A.OBJECT_NAME=C.SYNONYM_NAME
  6  AND        C.TABLE_OWNER=B.OWNER AND C.TABLE_NAME=B.OBJECT_NAME
  7  AND        B.OBJECT_NAME LIKE 'V_$%' AND B.OBJECT_TYPE = 'VIEW'
  8  /

View created.

SQL> SELECT COUNT(*) FROM MY_MAP;

  COUNT(*)
----------
       401

因为查询稍微长,而且后面还要用到这段查询的结果,所以我们把它创建视图。可以知道有401个 V$同义词映射到后面的V_$视图 。

再看看有没有重复的。

SQL> select V$SYNONYM,count(*) from MY_MAP group by V$SYNONYM having count(*)>1;

no rows selected

SQL> select  V_$VIEW ,count(*) from MY_MAP group by V_$VIEW having count(*)>1;

V_$VIEW                                    COUNT(*)
---------------------------------------- ----------
V_$SORT_USAGE                                     2

SQL> select V$SYNONYM,V_$VIEW from MY_MAP  where V_$VIEW ='V_$SORT_USAGE';

V$SYNONYM                                V_$VIEW
---------------------------------------- ----------------------------------------
V$TEMPSEG_USAGE                          V_$SORT_USAGE
V$SORT_USAGE                             V_$SORT_USAGE

 哦,原来这401对 map中,有两个V$同义词指向了同一个V_$ 视图。 那么就是说402个V_$视图中有两个没有同义词。
他们是这两个。

SQL> SELECT OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_NAME LIKE'V_$%' AND OBJECT_NAME NOT IN (SELECT V_$VIEW FROM MY_MAP);

OBJECT_NAME
----------------------------
V_$KCCFE
V_$KCCDI

 V_$的总结是这样的,一共有402个。其中400个有V$同义词指向他们。其中V_$SORT_USAGE被两个同义词V$TEMP_USAGE和V$SORT_USAGE同时指向。有两个没有同义词,他们是V_$KCCFE和  V_$KCCDI。

 

这7个view是

SQL> SELECT OWNER,OBJECT_TYPE,OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_TYPE='VIEW' AND OBJECT_NAME LIKE'V$%';

OWNER                OBJECT_TYPE          OBJECT_NAME
-------------------- -------------------- ----------------------------
SYS                  VIEW                 V$OBJECT_USAGE
SYS                  VIEW                 V$OLAP_ALTER_SESSION
SYS                  VIEW                 V$PING
SYS                  VIEW                 V$CACHE
SYS                  VIEW                 V$CACHE_LOCK
SYS                  VIEW                 V$FALSE_PING
SYS                  VIEW                 V$CACHE_TRANSFER

他们也有同义词,如下

SQL> SELECT OWNER,SYNONYM_NAME,TABLE_OWNER,TABLE_NAME FROM DBA_SYNONYMS WHERE TABLE_NAME IN
  2  (SELECT OBJECT_NAME FROM DBA_OBJECTS WHERE OBJECT_TYPE='VIEW' AND OBJECT_NAME LIKE 'V$%');

OWNER                SYNONYM_NAME                   TABLE_OWNER                    TABLE_NAME
-------------------- ------------------------------ ------------------------------ ------------------------------
PUBLIC               V$OBJECT_USAGE                 SYS                            V$OBJECT_USAGE
PUBLIC               ALL_OLAP_ALTER_SESSION         SYS                            V$OLAP_ALTER_SESSION
PUBLIC               V$PING                         SYS                            V$PING
PUBLIC               V$CACHE                        SYS                            V$CACHE
PUBLIC               V$CACHE_LOCK                   SYS                            V$CACHE_LOCK
PUBLIC               V$FALSE_PING                   SYS                            V$FALSE_PING
PUBLIC               V$CACHE_TRANSFER               SYS                            V$CACHE_TRANSFER

注意有一个的同义词不是以V$开头的。

这样我们413个V$同义词中401个指向了V_$ view,6个指向了fixed view。 另外6个指向哪里呢? 他们指向了前面401个V$同义词中的6个。 也就是同义词指向同义词。

 

 

 

OK。 总结如下

V$开头的对象有 413个同义词 7个view

V_$开头的对象402个全是view。

这402个view由401个V$同义词指向。剩下的两个没有同义词。

另外的7个view占用了6个v$同义词,剩下的6个v$同义词指向其他的v$同义词。 没占用v$同义词的那个视图是V$OLAP_ALTER_SESSION,他的同义词是V$OLAP_ALTER_SESSION

 

 

 

 

posted on 2013-04-09 12:45  kramer  阅读(354)  评论(0编辑  收藏  举报

导航