【动态性能视图】v$fixed_table和v$fixed_view_definition

v$fixed_table这个视图中存储的是oracle的基表,可是当我们desc的时候会发现,里面有个字段是type,如下:
SYS@ORA10G>desc v$fixed_table
 Name           Null?    Type
 -------------- -------- ----------------------
 NAME                    VARCHAR2(30)
 OBJECT_ID               NUMBER
 TYPE                    VARCHAR2(5)
 TABLE_NUM               NUMBER

SYS@ORA10G>
SYS@ORA10G>select type,count(*) from v$fixed_table group by type;

TYPE    COUNT(*)
----- ----------
TABLE        613
VIEW         770

SYS@ORA10G>
我们会发现,类型有两种,一种是table一种是view,v$fixed_table从字面理解是“固定表”,既然是表,怎么会有视图呢,查看官方文档得之,里面不但有表还有动态性能视图,此时吾大怒,动态性能视图多了个什么呀,这个视图明明叫fixed_table“固定表”,也就是不允许“动”的表,为什么把动态性能视图放进行。看来有必要 动态性能视图。
网上有好多朋友也都刨过动态性能视图的根,我在此也小刨一下。刨谁呢?随便吧。
SYS@ORA10G>select * from v$fixed_table where type=upper('view') and rownum<=2;

NAME                            OBJECT_ID TYPE   TABLE_NUM
------------------------------ ---------- ----- ----------
GV$WAITSTAT                    4294951371 VIEW       65537
V$WAITSTAT                     4294950915 VIEW       65537

SYS@ORA10G>
这里我选了2个,一个是v$开头的一个是gv$开头的, gv$多用于RAC环境, 在单实例的数据库中, v$和gv$的内容是一样的,不过,他们的关系是怎么样的,还需要刨了之后才知道。那 就选它了V$WAITSTAT。


1)查看V$WAITSTAT这个动态性能视图的创建脚本,我们采用dbms_metadata.get_ddl这个函数包,将它的脚本刨出来。
SYS@ORA11GR2>select dbms_metadata.get_ddl(upper('view'),upper('v$waitstat'),upper('sys')) from dual;
ERROR:
ORA-31603: object "V$WAITSTAT" of type VIEW not found in schema "SYS"
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105
ORA-06512: at "SYS.DBMS_METADATA", line 3912
ORA-06512: at "SYS.DBMS_METADATA", line 5678
ORA-06512: at line 1



no rows selected

SYS@ORA11GR2>

2)从错误中我们得知,在sys下的视图中没有找到V$WAITSTAT,看来V$WAITSTAT是混进视图的队伍中的,既然如此,我们从all_objects这个视图中找找看,看看它到底是什么?
SYS@ORA11GR2>col object_name for a15
SYS@ORA11GR2>col object_type for a15
SYS@ORA11GR2>col owner for a15
SYS@ORA11GR2>select object_name,object_type,owner from all_objects where object_name=upper('v$waitstat');

OBJECT_NAME     OBJECT_TYPE     OWNER
--------------- --------------- ---------------
V$WAITSTAT      SYNONYM         PUBLIC

SYS@ORA11GR2>

3)原来如此,原来v$waitstat是个同义词,那么我就按照同义词,并且它的owner是public往下刨吧。
SYS@ORA11GR2>select dbms_metadata.get_ddl(upper('synonym'),upper('v$waitstat'),upper('public')) from dual;

DBMS_METADATA.GET_DDL(UPPER('SYNONYM'),UPPER('V$WAITSTAT'),UPPER('PUBLIC'))
-------------------------------------------------------------

  CREATE OR REPLACE PUBLIC SYNONYM "V$WAITSTAT" FOR "SYS"."V_$WAITSTAT"



SYS@ORA11GR2>

4)嗯,刨出来了,v$waitstat原来是v_$waitstat的同义词,既然找到了,那么就继续刨吧
SYS@ORA11GR2>select object_name,object_type,owner from all_objects where object_name=upper('v_$waitstat');

OBJECT_NAME     OBJECT_TYPE     OWNER
--------------- --------------- ---------------
V_$WAITSTAT     VIEW            SYS

SYS@ORA11GR2>

5)通过上面的查询,v_$waitstat确实是一个视图并且属于sys,我们继续刨
SYS@ORA11GR2>set long 99999
SYS@ORA11GR2>set pagesize 300
SYS@ORA11GR2>select dbms_metadata.get_ddl(upper('view'),upper('v_$waitstat'),upper('sys')) from dual;

DBMS_METADATA.GET_DDL(UPPER('VIEW'),UPPER('V_$WAITSTAT'),UPPER('SYS'))
---------------------------------------------------------------------

  CREATE OR REPLACE FORCE VIEW "SYS"."V_$WAITSTAT" ("CLASS", "COUNT", "TIME") AS

  select "CLASS","COUNT","TIME" from v$waitstat



SYS@ORA11GR2>

6)此时我们发现v_$waitstat这个视图是跟据v$waitstat创建的,感觉是个圈,又绕回去了。
其实则不然,这一步v$waitstat就是v$fixed_table中的那个动态性能视图。我们在查看官方文档的时候,在Reference这本书中查找v$fixed_table的时候,你会发现v$fixed_table下面有个视图,叫v$fixed_view_definition(字面翻译,固定视图定义)。既然我们在v$fixed_table中找到的视图,那么这个视图的定义,估计在v$fixed_view_definition里面有,我们查询一下
SYS@ORA11GR2>select view_definition from v$fixed_view_definition where view_name=upper('v$waitstat');

VIEW_DEFINITION
-------------------------------------------------------------------------
select class,count,time from gv$waitstat where inst_id = USERENV('Instance')

SYS@ORA11GR2>

7)我们再观察,发现v$waitstat这个视图的定义是来源于gv$waitstat(gv$waitstat这个动态性能视图主要是用于RAC环境),我们之前想刨那个视图的时候,查出来两个,就包括gv$waitstat,也就是说,gv$waitstat在v$fixed_view_definition中也有定义信息,查之
SYS@ORA11GR2>select view_definition from v$fixed_view_definition where view_name=upper('gv$waitstat');

VIEW_DEFINITION
--------------------------------------------------------------------------
select inst_id,decode(indx,1,'data block',2,'sort block',3,'save undo block', 4,
'segment header',5,'save undo header',6,'free list',7,'extent map', 8,'1st level
 bmb',9,'2nd level bmb',10,'3rd level bmb', 11,'bitmap block',12,'bitmap index b
lock',13,'file header block',14,'unused', 15,'system undo header',16,'system und
o block', 17,'undo header',18,'undo block'), count,time from x$kcbwait where ind
x!=0

SYS@ORA11GR2>
哦了,看到底儿了,基表是x$kcbwait


小结:

1)X$开头oracle的基表(sys)-> gv$开头的固定视图(sys)->v$开头的固定视图(sys)->v_$开头的视图(sys)->v$开头的同义词(pubilc)

2)我们在sys用户下查询动态性能视图的时候,查的应该就是自己的动态性能视图,如果在其他有dba角色的用户下查询的话,应该查的是public用户下的同义词。

3)动态性能视图为什么是固定视图?因为这个视图是不允许修改的。动态性能视图的结构信息在 v$fixed_view_definition中定义。

4)v$fixed_table和 v$fixed_view_definition也都是动态性能视图。有兴趣,大家可以刨刨。






来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/685769/viewspace-744762/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/685769/viewspace-744762/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值