熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle動態視圖

2013-11-13 22:23:42  來源: Oracle 

  在oracle運維的過程中經常會使用到一些以V$開頭的動態視圖比如V$session 有一次偶然看到有人用V_$session 初以為別人寫錯了沒想到desc v_$session以後能看到和v$session一樣的結構再以後又發現以gv$開頭的視圖等等趁這次在一台Linux系統上裝oracle的機會終於弄清楚了這些動態視圖與相應表之間的關系

  這些都是由oracle自己管理的數據結構得從v$fixed_table入手

  [oracle@ admin]$ sqlplus sys/sys@archdw as sysdba

  SQL*Plus: Release Production on Mon Dec ::

  Copyright (c) Oracle  All rights reserved

  Connected to:

  Oracle Database g Enterprise Edition Release – Production

  With the Partitioning OLAP Data Mining and Real Application Testing options

  SQL> desc v$fixed_table;

  Name                                      Null?    Type

  —————————————– ——– —————————

  NAME                                               VARCHAR()

  OBJECT_ID                                          NUMBER

  TYPE                                               VARCHAR()

  TABLE_NUM                                          NUMBER

  SQL> select * from v$fixed_table

  NAME                            OBJECT_ID TYPE   TABLE_NUM

  —————————— ——— —– ———

  X$KQFTA                        TABLE         

  X$KQFVI                        TABLE         

  GV$PROCESS                     VIEW      

  V$PROCESS                      VIEW      

  GV$BGPROCESS                   VIEW      

  ………………………………………

  從上面可以看到GV$與V$是視圖X$是表那它們之間是什麼關系呢?從另一個視圖v$fixed_view_definition中得到如下信息(以v$fixed_table為例)

  SQL> set linesize

  SQL> col view_name for a

  SQL> col view_definition for a

  SQL> select * from v$fixed_view_definition where view_name=V$FIXED_TABLE;

  VIEW_NAME            VIEW_DEFINITION

  ———————      ——————————————————————————–

  V$FIXED_TABLE     select  NAME OBJECT_ID TYPE TABLE_NUM from GV$FIXED_TABLE where inst_id =

  USERENV(Instance)

  SQL> select * from v$fixed_view_definition where view_name=GV$FIXED_TABLE;

  VIEW_NAME               VIEW_DEFINITION

  ————————     ——————————————————————————–

  GV$FIXED_TABLE    select inst_idkqftanam kqftaobj TABLE indx from x$kqfta union all select i

  nst_idkqfvinam kqfviobj VIEW from x$kqfvi union all select inst_idk

  qfdtnam kqfdtobj TABLE from x$kqfdt

  原來gv$是全局視圖而v$是針對某個實例的視圖$X是所有gv$的數據來源從gv$到v$需要加上where inst_id = USERENV(Instance)一般來說一個oracle數據庫只會有一個實例對其操作但在RAC上可以有多台實例同時裝載並打開一個數據庫在RAC上得到的結果是

  etl@ALIDW> select distinct inst_id from gv$session;

  INST_ID

  ———

  

  

  

  

  這rac上有四個實例再次加深了對實例與數據庫的理解

  那gv_$與v_$的定義又在什麼地方呢?原來在$ORACLE_HOME/rdbms/admin存放著系統管理腳本在catalogsql中發現

  –CATCTL S    Initial scripts single process

  @@cdstrt

  @@cdfixedsql

  @@cdcoresql

  –CATCTL M

  @@cdplsqlsql

  @@cdsqlddlsql

  ……………………………………………………………………………

  進一步在cdfixedsql中找到

  create or replace view v_$fixed_table as select * from v$fixed_table;

  create or replace public synonym v$fixed_table for v_$fixed_table;

  grant select on v_$fixed_table to select_catalog_role;

  create or replace view gv_$fixed_table as select * from gv$fixed_table;

  create or replace public synonym gv$fixed_table for gv_$fixed_table;

  grant select on gv_$fixed_table to select_catalog_role;

  ……………………………………………………………………………………………………………

  [oracle@ admin]$ sqlplus sys/sys@archdw as sysdba

  SQL> select * from user_role_privs;

  USERNAME                       GRANTED_ROLE                   ADM DEF OS_

  —————————— —————————— — — —

  SYS                            SELECT_CATALOG_ROLE            YES YES NO

  因此我們常用的v$ 是v_$的同義詞v_$是基於真正的視圖v$而真正的v$視圖是在gv$的基礎上限制inst_id得到;

  我們常用的gv$是gv_$的同義詞gv_$基於真正的視圖gv$而真正的gv$視圖基於系統表X$


From:http://tw.wingwit.com/Article/program/Oracle/201311/18981.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.