oracle資料字典簡介

zecaro發表於2011-03-02

         Oracle的字典表和檢視基本上可以分為三個層次:

1.X$表

 X$資料結構是Oracle資料庫管理系統(DBMS)的核心。在資料庫管理系統的核心中,他們是處於不斷變化中的記憶體結構,儲存著例項(Instance)執行期間的各種統計資訊。

2.GV$和V$檢視


從Oracle8開始,GV$檢視開始被引入,其含義為Global V$。除了一些特例以外,每個V$檢視都有一個對應的GV$檢視存在,如:v$session和gv$session。

GV$檢視的產生是為了滿足RAC(舊稱OPS)環境的需要,在RAC環境中,查詢GV$檢視將返回所有例項資訊。

而對應的V$檢視基於GV$檢視,增加了INST_ID列建立,只包含當前連線例項資訊。包含類似限制語句:where inst_id = USERENV('Instance'), 來達到返回當前例項資訊的目的。


>  select view_definition from v$fixed_view_definition a where a.VIEW_NAME='V$PARAMETER';

VIEW_DEFINITION
------------------------------------------------------------------------------------------------------------------------

select  NUM , NAME , TYPE , VALUE , DISPLAY_VALUE, ISDEFAULT , ISSES_MODIFIABLE , ISSYS_MODIFIABLE , ISINSTANCE_MODIFIABLE, ISMODIFIED , ISADJUSTED , ISDEPRECATED, ISBASIC, DESCRIPTION, UPDATE_COMMENT, HASH  from GV$PARAMETER  where   inst_id = USERENV('Instance')

3.GV_$,V_$檢視和V$,GV$同義詞

透過catalog.sql建立(位於$ORACLE_HOME/RDBMS/ADMIN目錄下)。

這裡擷取了11gr2的catalog.sql,以session檢視為例。

create or replace view v_$session as select * from v$session;
create or replace public synonym v$session for v_$session;
grant select on v_$session to select_catalog_role;


create or replace view gv_$session as select * from gv$session;
create or replace public synonym gv$session for gv_$session;
grant select on gv_$session to select_catalog_role;

         首先是檢視V_$和GV_$被建立(每一部分第一句)。然後基於V_$檢視的同義詞被建立(每一部分第二句)。
         所以,
實際上通常我們訪問的V$檢視,其實是指向V_$檢視的同義詞。而V_$檢視是基於真正的V$檢視(這個檢視是基於X$表建立的,如下)。

select view_definition from v$fixed_view_definition a where a.VIEW_NAME='GV$PARAMETER';

VIEW_DEFINITION
------------------------------------------------------------------------------------------------------------------------

select x.inst_id,x.indx+1,ksppinm,ksppity,ksppstvl, ksppstdvl, ksppstdf,  decode(bitand(ksppiflg/256,1),1,'TRUE','FALSE'),  decode(bitand(ksppiflg/65536,3),1,'IMMEDIATE',2,'DEFERRED',   3,'IMMEDIATE','FALSE'), decode(bitand(ksppiflg,4),4,'FALSE', decode(bitand(ksppiflg/65536,3), 0, 'FALSE','TRUE')),     decode(bitand(ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE'),  decode(bitand(ksppstvf,2),2,'TRUE','FALSE'),  decode(bitand(ksppilrmflg/64, 1), 1, 'TRUE', 'FALSE'),  decode(bitand(ksppilrmflg/268435456, 1), 1, 'TRUE', 'FALSE'),  ksppdesc, ksppstcmnt, ksppihash    from  x$ksppi x, x$ksppcv y  where (x.indx = y.indx) and  bitand(ksppiflg,268435456)= 0 and  ((translate(ksppinm,'_','#') not like '##%') and    ((translate(ksppinm,'_','#') not like '#%')      or (ksppstdf = 'FALSE') or      (bitand(ksppstvf,5) > 0)))

 

         此外,從上面的定義還可以看到 v$parameter展現的是不包含"_"開頭的引數(通常稱為隱含引數)。

 

參考

探索資料字典,提高自學習Oracle能力

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23650854/viewspace-688294/,如需轉載,請註明出處,否則將追究法律責任。

相關文章