天天看點

走近Oracle資料字典--資料字典表

  • 作者: 三十而立
  • 時間:2009年11月08日 8:59:25
  • 請尊重原創作品。轉載請保持文章完整性,并以超連結形式注明原始作者“inthirties(三十而立)”和出處”http://blog.csdn.net/inthirties/archive/2009/11/08/4785106.aspx”,深入讨論可以聯系[email protected]。

資料字典,第一次聽到這個詞的時候,還是剛剛踏進IT行業,計算機的知識是自己業餘學的,是以對這樣的專有名稱并不了解,不恥下問的問一個老鳥,告知是我們寫程式時,比如狀态,地方碼,區碼等一些基礎資訊,也叫做code table。 哦。 原來是這麼回事。有了這個經曆,再一次在談及資料庫時聽到資料庫裡也有資料字典的時候,就沒有那麼多的陌生了,心裡知道,對于資料庫軟體來說,他本身也是和我們寫的程式一樣,也是一應用,那麼裡面的資料字典就是 資料庫應用需要的一些基礎資訊叻。 

的确,資料庫是資料的集合,資料庫維護和管理這使用者的資料,那麼這些使用者資料表都存在哪裡,使用者的資訊是怎樣的,存儲這些使用者的資料的路徑在哪裡,這些資訊不屬于使用者的資訊,卻是資料庫維護和管理使用者資料的核心,這些資訊就是資料庫的資料字典來維護的,資料庫的資料字典就彙集了這些資料庫運作所需要的基礎資訊叻。 每個資料庫都提供了各自的資料字典的方案,雖然形式不同,但是目的和作用是一樣的,比如在mysql裡資料字典是在information_schema裡表現的,sqlserver則是在sys這個系統schema裡來展示的,那麼Oracle又是如何的叻。 這是本文章所主要要探讨的内容叻。 

Oracle裡資料字典按照他們存在的形式可以分為資料字典表和動态性能視圖。 

資料字典表和使用者建立的表沒有什麼差別,不過資料字典表裡的資料是Oracle系統存放的系統資料,而普通表存放的是使用者的資料而已,為了友善的差別這些表,這些表的名字都是用"$"結尾,在我們看到的sql語句裡看到"$"結尾的這些表,大家就可以想到這可能是一個資料字典表了,同樣,既然如此,我們建立自己的使用者表的時候就不要用“$”結尾,以免讓别人誤會, 資料字典表是系統存放系統使用者的,是以他的owner是sys,在手工用create database的指令的時候,會調用 $ORACLE_HOME/rdbms/admin /sql.bsq檔案,這個就會執行生成我們這些資料字典表。 bsq檔案是什麼,以前關注過我的朋友,還記得我寫的有關RMAN的文章麼,其中就談到過這個bsq檔案,是客戶sqlplus尅調用的檔案。有興趣的朋友可以打開看看這個檔案,裡面是不是有很多$結尾的表呀,那麼這些都是資料字典表了。 

對于資料字典表,裡面的資料是有資料庫系統自身來維護的,是以這裡雖然和普通表一樣可以用DML語句來修改資料内容,但是大家最好還是不要自己來做了,因為這些表都是作用于資料庫内部的,我們有時看到的604的的recursive sql這裡的sql實際上很有可能就是我們的相關的資料字典表的執行内容。是以這裡我們切記記住不要去修改這些表裡的内容。 

剛才說道了。這裡的資料字典表的使用者都是sys,存在在system這個表空間裡,表名都用"$"結尾,為了便于使用者對資料字典表的查詢,這樣的名字r是不利于我們記憶的,是以Oracle對這些資料字典都分别建立了使用者視圖視圖,不僅有叻更容易接受的名字,還隐藏了資料字典表表之間的關系,讓我們位元組通過視圖來進行查詢,簡單而形象,Oracle針對這些對象的範圍,分别把視圖命名為DBA_XXXX, ALL_XXXX和USER_XXXX 

DBA_XXXX 可以看到所有資料字典裡的資訊 

ALL_XXXX 可以看到所有這個使用者可以看到的資訊 

USER_XXXX 僅僅是這個使用者擁有的資訊 

比如說DBA_TABLES, ALL_TABLES和USER_TABLES, 

這個視圖是由sys使用者建立的,是以使用需要加上sys 

,顯然這個太麻煩了,是以Oracle為每個資料字典表的視圖頭建立了同名字的公共同義詞(public synonyms). 這樣簡單的處理就省去了寫sys.這個麻煩事。 

Oracle為了便于彙總資料字典表的資訊,把所有的資料字典都彙集到dictionary表裡了,通過對這個表的查詢,我們可以很友善的找到資料庫提供的資料字典。 

SQL> desc dictionary; 

Name Type Nullable Default Comments 

---------- -------------- -------- ------- -------------------------- 

TABLE_NAME VARCHAR2(30) Y Name of the object 

COMMENTS VARCHAR2(4000) Y Text comment on the object 

上面我們了解了這裡資料字典表的内部機理,我們通過實驗來加深一下影響吧 

我們以ALL_TABLES這個為例,看看她是怎樣的一回事叻 

我們可以先看看dictionary表裡确實有這樣一個資料字典 

SQL> select * from dictionary a where a.table_name = 'ALL_TABLES'; 

TABLE_NAME COMMENTS 

------------------------------ -------------------------------------------------------------------------- 

ALL_TABLES Description of relational tables accessible to the 

這裡ALL_TABLES是一個同義詞,查出關聯對象 

SQL> select * from dba_synonyms a where a.synonym_name = 'ALL_TABLES'; 

OWNER SYNONYM_NAME TABLE_OWNER TABLE_NAME 

------------------------------ ------------------------------ ------------------------------ ------------ 

PUBLIC ALL_TABLES SYS ALL_TABLES 

是SYS的ALL_TABLES的同義詞 

根據上面我們提到的,這個的同義詞指向一個view,我們查查view的定義 

SQL> select * from dba_views a where a.view_name = 'ALL_TABLES'; 

OWNER VIEW_NAME TEXT_LENGTH TEXT 

------------------------------ ------------------------------ ----------- ------------------------------- 

SYS ALL_TABLES 4173 select u.name, o.name,d........ 

from sys.user$ u, sys.ts$ ts, s ys.seg$ s, sys.obj$ co, sys.tab$ t, sys.obj$ o,sys.obj$ cx, sys.user$ cu 

.................. 

這裡就可以看到這個all_tables查詢了 sys.user$ u, sys.ts$ ts, s ys.seg$ s, sys.obj$ co, sys.tab$ t, sys.obj$ o,sys.obj$ cx, sys.user$ cu 這樣一系清單,有興趣的朋友看看,這裡是不是All的這個邏輯呀,也就是這個使用者可以看到的所有的表。 

這裡我們大緻描述了Oracle裡資料字典表的組織方式,作為資料庫DBA,我們的工作職責就是對資料以及資料庫進行有效的維護,那麼熟記這些資料字典和使用這些資料字典表是我們所必須具備的能力, 最好的記憶方式就是不停的了解上應用。 大家多試試吧。 

有些細心的朋友,可能在查詢剛才的dictionary表的時候,除了看到這些ALL, DBA,USER,還看到一些V$ GV$這樣的記錄,他們是什麼東東,他們在這個表裡出現,也應該是資料字典吧,他們有什麼作用呢,他們又是什麼來曆呢? 

讓我們關注下一集 走近Oracle資料字典<二>--動态性能視圖

  • 如果沒有那句“三十而立”,三十歲的男人正可以輕輕松松
  • 專業論壇 http://www.inthirties.com
  • 技術部落格 http://blog.csdn.net/inthirties
  • 個人站點 http://blog.inthirties.com
  • Oracle Mysql技術論壇| 打造實用的Oracle Mysql技術交流園地