zoukankan      html  css  js  c++  java
  • 这两个视图要了解——v$fixed_table和v$fixed_view_definition

    此文转载自 链接:http://blog.itpub.net/685769/viewspace-744762/
     
    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也都是动态性能视图。有兴趣,大家可以刨刨。
  • 相关阅读:
    hdu4535
    hdu4535
    hdu4503 概率
    hdu4503 概率
    hdu4499 搜索
    hdu4499 搜索
    hdu1146
    hdu1146
    Proj THUDBFuzz Paper Reading: Typestate-Guided Fuzzer for Discovering Use-after-Free Vulnerabilities
    Proj THUDBFuzz Paper Reading: Intriguer: Field-Level Constraint Solving for Hybrid Fuzzing
  • 原文地址:https://www.cnblogs.com/historynote/p/12625706.html
Copyright © 2011-2022 走看看