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