【动态性能视图】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也都是动态性能视图。有兴趣,大家可以刨刨。