轉自:https://www.cnblogs.com/pengineer/p/4419275.html
Oracle通過數據字典來管理和展現數據庫信息,數據字典通常儲存數據庫的元數據,是數據庫的“數據庫”。通常說的數據字典由4部分組成:內部RDBMS(X$)表、數據字典表、動態性能視圖(V$)和(靜態)數據字典視圖。(兩表兩視圖)
1,內部RDBMS(X$)表X$表示Oracle數據庫的核心部分,這些表用於 跟蹤數據庫內部信息,維持數據庫的正常運行。X$表是加密命名的,而且Oracle不做文檔說明。X$表是Oracle數據庫的運行基礎,在數據庫啟動時由Oracle應用程序動態創建。比如我們熟知的X$BH、X$KSMSP等。研究這些表的最好的辦法就是借用Oracle的autotrace功能(set autotrace trace explain)。2,數據字典表數據字典表(Data dictionary table)用以存儲表、索引、約束以及其它 數據庫結構的信息,這些對象通常以“$”結尾(例如:TAB$、OBJ$、TS$等),在創建數據庫的時候通過運行$ORACLE_HOME/rdbms/admin/sql.bsq腳本來創建。sql.bsq是一個非常重要的文件,其中包含了數據字典表的定義及注釋說明,應仔細閱讀研究。比如我們經常使用的V$DBA_OBJECT視圖就是基於V$OBJ創建的;再比如,當用戶創建一張表的時候,Oracle將會在后台執行一系列的內部操作,比如向objV$表中插入數據、向tab$表中記錄表數據等。Oracle通過將DDL解析成DML操作,並且將這些操作記錄在數據字典表中,那么我們當然可以通過反向解析得到原始的創建語句,從Oracle 9i 開始,一個新的工具包 DBMS_METADATA 就可以完成該功能:

3,靜態數據字典視圖 由於X$表和數據字典表通常不能直接被用戶訪問,Oracle創建了靜態數據字典視圖來提供用戶對於數據字典信息的訪問,由於這些信息通常相對穩定,不能直接修改,所以又被稱為靜態數據字典視圖。靜態數據字典視圖在創建數據庫時由$ORACLE_HOME/rdbms/admin/catagory.sql腳本創建。 靜態數據字典視圖按照前綴的不同通常分成三類: ● USER_:用戶所擁有的相關對象信息; ● ALL_:用於有權限訪問的所有對象的信息; ● DBA_:數據庫所有相關對象的信息,用於需要有 select any table 的權限才能訪問。 通過三類視圖在本質上是為了實現權限控制。在Oracle數據庫中,每個用戶與方案(Schema)是對應的,Schema是用戶所擁有的對象的集合。數據庫通過Schema將不同用戶的對象隔離開來,用戶可以自由的訪問自己的對象,但是要訪問其他Schema對象就需要相關的授權。 4,動態性能視圖 動態性能視圖記錄了數據庫運行時信息和統計數據,大部分動態性能視圖被實時更新以及反映數據庫當前狀態。在數據庫啟動時,Oracle動態創建X$表,在此基礎上,Oracle創建了GV$和V$視圖,GV$即Global V$,除了一些特例外,每個V$都對應一個GV$。GV$產生是為了OPS/RAC環境的需要,每個V$都是基於GV$的,只是GV$多了INST_ID列來顯示實例ID。 (1)如何查看一個視圖的底層創建語句? Oracle提供了一些特殊的視圖用以記錄其他視圖的創建方式,v$fixed_view_definition就是其中之一。

(2)查詢V$視圖時,報的錯卻是V_$視圖不存在,V_$視圖不是基於V$視圖創建的嗎,怎么反向報錯了? 為了防止普通用戶的誤操作,Oracle對通過軟件機制對V$視圖的訪問做了限制,它不允許普通用戶直接訪問V$視圖,但我們平時不是經常訪問嗎?這其實是Oracle引入了V_$視圖。在建立V$視圖后,Oracle就建立了V_$視圖,隨后為V_$視圖建立了與V$視圖同名的共用同義詞。這些工作都是通過catalog.sql腳本(該腳本位於$ORACLE_HOME/rdbms/admin/目錄下)實現的。 如: 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; --同名同義詞 也就是說,大部分用戶訪問的V$對象,並不是視圖,而是執行V_$視圖的同義詞;而V_$視圖時基於真正V$視圖創建的。
