【DB筆試面試539】在Oracle中,數據字典分為哪幾類?
- 2019 年 10 月 10 日
- 筆記
♣
題目部分
在Oracle中,數據字典分為哪幾類?
♣
答案部分
數據字典(Data Dictionary)也就是通常所說的系統目錄,它是Oracle資料庫中最重要的組成部分。數據字典記錄了資料庫的系統資訊,它是只讀表和視圖的集合,數據字典的所有者為SYS用戶,所有的數據字典表和視圖都被儲存在該資料庫的SYSTEM表空間中。用戶只能在數據字典上執行查詢操作,而其維護和修改是由系統自動完成的。數據字典中存放了資料庫自身的很多資訊,包括了用於描述資料庫和它的所有對象的資訊,所以,數據字典是每個Oracle資料庫的核心。例如一個表的創建者資訊,創建時間資訊,所屬表空間資訊,用戶訪問許可權資訊等。
Oracle數據字典可以包括四個層次,分別為X$內部表、基礎數據字典表、數據字典視圖和動態性能視圖。
一.內部RDBMS(X$)表
X$表是Oracle資料庫的核心部分,用於跟蹤資料庫內部資訊,維護資料庫的正常運行。X$是加密命名的,而且Oracle官方文檔不做說明,例如,X$BH、X$KSMSP等。X$表是Oracle資料庫的運行基礎,在資料庫啟動時由Oracle應用程式自動創建。所以,Oracle不允許SYSDBA以外的用戶直接訪問,也不能授權給其他用戶。一般而言,對於這種對象,進行觀察、發現、研究X$表的好辦法是借用Oracle的AUTOTRACE功能,當查詢一些視圖時,可以發現這些X$底層表,例如查詢V$PARAMETER時。
普通用戶如何查詢X$內部表呢?以X$BH表為例,以SYS用戶執行以下命令即可:
CREATE OR REPLACE VIEW BH AS SELECT * FROM SYS.X$BH; CREATE OR REPLACE PUBLIC SYNONYM X$BH FOR BH;
二.數據字典表
數據字典表用以存儲表、索引、約束以及其他資料庫結構的資訊。這些對象通常是以「$」結尾(例如:TAB$、OBJ$、TS$等)。Bsq是非常重要的一個文件,其中包含了數據字典的定義以及注釋說明,深入學習Oracle資料庫的用戶都應該仔細閱讀該文件,該文件位於$ORACLE_HOME/rdbms/admin目錄下(在Oracle 11g中bsq文件被分別歸類到不通的.bsq文件)。這些數據字典表對於資料庫的穩定運行生死攸關,所以通常Oracle不允許直接對數據字典進行操作。當用戶執行DDL和DML操作時,在後台Oracle將這些操作解析為對於數據字典的自動執行。
三.靜態數據字典視圖
由於X$表和數據字典表通常不能直接訪問,因此,Oracle創建了靜態數據字典視圖提供用戶對於數據字典資訊的訪問,由於這些資訊相對穩定、不能直接修改,所以又被稱為靜態數據字典視圖。靜態數據字典主要反應的是資料庫中的對象資訊。靜態數據字典視圖是由catalog.sql腳本創建(在$ORACLE_HOME/rdbms/admin下)。靜態數據字典中的視圖可以分為三類,它們分別由三個前綴構成:USER_*、ALL_*和DBA_*。
(1) USER_*:該類視圖存儲了關於當前用戶所擁有的對象的資訊,即所有在該用戶模式下的對象,例如:USER_USERS、USER_TABLES、USER_VIEWS。
(2) ALL_*:該類視圖存儲了當前用戶能夠訪問的對象的資訊。(與USER_*相比,ALL_*並不需要擁有該對象,只需要具有訪問該對象的許可權即可),例如:ALL_USERS、ALL_TABLES、ALL_VIEWS。
(3) DBA_*:該類視圖存儲了資料庫中所有對象的資訊。(前提是當前用戶具有訪問這些資料庫的許可權,一般來說,必須具有管理員許可權)。例如:DBA_USERS、DBA_TABLES、DBA_VIEWS。
這裡要說明一下,並不是所有的對象都是有三層對象視圖,有時候all_層視圖是被省略掉的,例如dba_recyclebin,就沒有對應的all_層視圖。
四.動態性能視圖
Oracle包含了一些潛在的由系統管理員如SYS維護的表和視圖,由於當資料庫運行的時候它們會不斷進行更新,所以,稱它們為動態數據字典,也稱為動態性能視圖(Dynamic Performance Views)。這些視圖提供了關於記憶體和磁碟的運行情況,記錄了資料庫運行時資訊和統計數據,大部分動態性能視圖被實時更新以反映資料庫的當前狀態。所以,只能對其進行只讀訪問而不能修改它們。動態數據字典是依賴資料庫運行的性能的,反映資料庫運行的一些內在資訊,所以,在訪問這類數據字典時往往不是一成不變的。動態性能視圖基於從資料庫記憶體結構構建的虛擬表。因此,它們不是存儲在資料庫中的常規表。由於數據動態更新,所以,動態性能視圖的讀一致性不能保證。
SYS是這些底層動態性能表的所有者,這些底層動態性能表的名字都以V$開頭,而且Oracle會為這些底層動態性能表創建SYS用戶的視圖,這些視圖的名稱以V$_開頭,基於這些表的視圖被創建後,Oracle還會為這些視圖創建公共同義詞,同義詞名稱以V$開頭,和這些動態性能表名稱保持一致,例如,視圖V$DATAFILE包含資料庫數據文件的資訊,而V$FIXED_TABLE包含資料庫中所有動態性能表和視圖的資訊。NOMOUNT狀態不能查詢所有的V$視圖。因為動態性能視圖不是真實表,所以數據依賴於資料庫和實例的狀態。例如,當資料庫處於NOMOUNT時,可以查詢V$INSTANCE和V$BGPROCEP。但是,在MOUNT資料庫之前,不能查詢V$DATAFILE。
數據字典基表是在任何Oracle資料庫中創建的第一個對象。資料庫的所有數據字典表和視圖都存儲在系統表空間中。所以,數據字典視圖是受讀一致性的影響的。因為當資料庫打開時,系統表空間總是聯機的,所以當資料庫打開時,數據字典總是可用的。總之,運用好數據字典技術,可以讓資料庫開發人員能夠更好地了解資料庫的全貌,這樣對於資料庫優化、管理等有極大的幫助。
V$動態視圖是描述Oracle當前運行狀態的一系列視圖集合。這部分視圖的特點是以V$開頭,描述系統當前狀態資訊。常見常用的如V$SESSION、V$SESSION_WAIT(Oracle 10g後,其中內容融入到V$SESSION中)、V$LOCK和V$SYSSTAT等。只有賦予了SELECT ANY DICTIONARY許可權的用戶才可以查詢所有的V$視圖。
V$視圖傳統上是代表系統當前狀態的描述,也就是即時性視圖。雖然可以描述當前系統中發生的瓶頸或者性能問題,但是當瓶頸接觸之後,很難發現和分析過去一個事件點的系統狀態和問題SQL。同時,如果需要對運行時間段的情況進行分析,採用時間段鏡像snap技術也存在一些偶然性。
從Oracle 10g開始,V$動態視圖進入了一個新的時代,可以保存V$SESSION的歷史資訊。ASH(Active Session History)技術就是每個一個間隔的時間段,保存當前動態視圖的鏡像進行保存,這些資訊保存7天。藉助ASH技術,Oracle提出了基於歷史進行分析的AWR(Automatic Workload Report)報表。最後,從性能主動優化的出發點,提出了ADDM(Automatic Database Diagnostic Monitor)報告,提供智慧化的資料庫優化提示。這些方便的功能特性,全都是基於動態視圖。v$動態視圖主要是針對SGA和資料庫實例進程的顯示。在這個過程中,Oracle使用了DMA(Direct Memory Access)技術,可以高效的獲取這些分析數據。
資料庫啟動時,Oracle動態創建X$表,在此基礎之上,Oracle創建了GV$和V$視圖。從Oracle 8開始GV$視圖開始被引入,其含義是Global,除一些特例之外,每個V$視圖都有一個對應的GV$視圖存在;GV$視圖的產生是為了滿足OPS/RAC環境的需要;每個V$視圖都包含如下類似語句,用於限制返回當前實例的資訊:
Where inst_id=USERENV('Instance');
下面介紹幾個與系統數據字典視圖定義有關的幾個視圖,而其它的視圖學習也可以根據下面這幾個視圖來學習:
(一)DICTIONARY和DICT_COLUMNS
l DICTIONARY視圖記錄了全部數據字典表的名稱和解釋,它有一個同義詞DICT。
l DICT_COLUMNS視圖記錄了全部數據字典表裡欄位名稱和解釋。
如果想查詢跟索引有關的數據字典,那麼可以使用如下SQL語句:
SELECT * FROM DICTIONARY WHERE INSTR(COMMENTS, 'index') > 0;

如果想知道數據字典中的USER_INDEXES視圖中各欄位的詳細含義,那麼可以用如下SQL語句:
SELECT COLUMN_NAME, COMMENTS FROM DICT_COLUMNS WHERE TABLE_NAME = 'USER_INDEXES';

依此類推,就可以輕鬆知道數據字典的詳細名稱和解釋,不用查看Oracle的其它文檔資料了。當然上面的結果也可以用如下語句來查詢:
SELECT * FROM DBA_COL_COMMENTS UCC WHERE UCC.TABLE_NAME='USER_INDEXES'; SELECT * FROM DBA_TAB_COMMENTS UTC WHERE UTC.TABLE_NAME='USER_INDEXES';
(二)V$FIXED_TABLE和V$FIXED_VIEW_DEFINITION
面試官可能會這樣問:「在Oracle中,哪個視圖可以查詢數據中所有底層的表?」。答案就是V$FIXED_TABLE。V$FIXED_TABLE可以查詢資料庫中所有底層的表。V$FIXED_TABLE視圖顯示資料庫中所有動態性能表、視圖和導出表。由於某些V$表(例如V$ROLLNAME)涉及底層的表,因此,沒有列出。另外,V$FIXED_VIEW_DEFINITION這個視圖包含所有固定視圖(以V$起頭的視圖)的定義,如下所示:
SYS@ORALHRDB1> DESC V$FIXED_TABLE Name Null? Type ----------------------------------------- -------- ---------------------------- NAME VARCHAR2(30) OBJECT_ID NUMBER TYPE VARCHAR2(5) TABLE_NUM NUMBER SYS@ORALHRDB1>SELECT VIEW_DEFINITION FROM V$FIXED_VIEW_DEFINITION WHERE VIEW_NAME='V$FIXED_TABLE'; VIEW_DEFINITION -------------------------------------------------------------------------------- select NAME , OBJECT_ID , TYPE , TABLE_NUM from GV$FIXED_TABLE where inst_id = USERENV('Instance') SYS@ORALHRDB1> SELECT VIEW_DEFINITION FROM V$FIXED_VIEW_DEFINITION WHERE VIEW_NAME='GV$FIXED_TABLE'; VIEW_DEFINITION -------------------------------------------------------------------------------- select inst_id,kqftanam, kqftaobj, 'TABLE', indx from x$kqfta union all select i nst_id,kqfvinam, kqfviobj, 'VIEW', 65537 from x$kqfvi union all select inst_id,k qfdtnam, kqfdtobj, 'TABLE', 65537 from x$kqfdt
可以看到底層的表主要由x$kqfta和x$kqfdt組成,而x$kqfvi主要是視圖的定義。
下表給出了一些常見的數據字典及其解釋:
表 3-15 常見的數據字典
視圖名稱 |
解釋 |
視圖名稱 |
解釋 |
---|---|---|---|
DBA_TABLES(TABS) |
所有用戶(當前用戶)的所有表的資訊 |
DBA_FREE_SPACE |
記錄系統表空間的自由空間的資訊 |
DBA_TAB_COLUMNS(COLS) |
所有用戶(當前用戶)的表的列的資訊 |
V$CONTROLFILE |
記錄系統控制文件的基本資訊 |
DBA_VIEWS |
所有用戶的所有視圖資訊 |
V$PARAMETER |
記錄系統各參數的基本資訊 |
DBA_SYNONYMS(SYN) |
所有用戶(當前用戶)同義詞資訊 |
V$CONTROLFILE_RECORD_SECTION |
記錄系統控制運行的基本資訊 |
DBA_SEQUENCES(SEQ) |
所有用戶(當前用戶)序列資訊 |
V$DATAFILE |
記錄來自控制文件的數據文件資訊 |
DBA_CONSTRAINTS |
用戶的表的約束資訊 |
V$FILESTAT |
記錄數據文件讀寫的基本資訊 |
DBA_INDEXES(IND) |
所有用戶(當前用戶)索引的簡要資訊 |
V$DATAFILE_HEADER |
記錄數據文件頭部的基本資訊 |
DBA_IND_COLUMNS |
所有用戶索引的列資訊 |
V$THREAD |
記錄日誌執行緒的基本資訊 |
DBA_TRIGGERS |
所有用戶觸發器資訊 |
V$LOG |
記錄日誌文件的基本資訊 |
DBA_SOURCE |
所有用戶存儲過程資訊 |
V$LOGFILE |
記錄日誌文件的概要資訊 |
DBA_SEGMENTS |
所有用戶段(表,索引及Cluster)使用空間的資訊 |
V$ARCHIVED_LOG |
記錄歸檔日誌文件的基本資訊 |
DBA_EXTENTS |
所有用戶段的擴展段資訊 |
V$ARCHIVE_DEST |
記錄歸檔日誌的路徑資訊 |
DBA_OBJECTS |
所有用戶對象的基要資訊 |
V$INSTANCE |
記錄當前實例的基本資訊 |
CAT |
當前用戶可以訪問的所有基表 |
V$SYSTEM_PARAMETER |
顯示實例當前有效的參數資訊 |
TAB |
當前用戶創建的所有基表,視圖,同義詞等 |
V$SGA |
顯示SGA區的大小資訊 |
DICT |
構成數據字典的所有表的資訊 |
V$SGASTAT |
記錄SGA使用統計詳細資訊 |
V$DATABASE |
記錄系統運行的情況 |
V$DB_OBJECT_CACHE |
記錄對象快取大小資訊 |
DBA_TABLESPACES |
記錄系統表空間的基本資訊 |
V$BGPROCESS |
顯示後台進程資訊 |
DBA_DATA_FILES |
記錄系統數據文件及表空間的基本資訊 |
V$SESSION |
顯示當前會話資訊 |
V$SORT_USAGE |
顯示臨時段的大小及會活、可以看出哪些進程硬碟排序 |
V$FIXED_TABLE |
列出當前發行的固定對象的說明 |
V$SQLAREA |
列出共享區的SQL使用統計 |
V$LATCH |
列出鎖存器的統計數據 |
V$SQLTEXT |
在SGA中屬於共享SQL游標的SQL語句內容 |
V$LIBRARYCHCHE |
有關庫快取性能的統計數據 |
V$SYSSTAT |
包括基本的實例統計數據 |
V$ROLLSTAT |
列出聯機的回滾段的名字 |
V$SYSTEM_EVENT |
包括一個事件的總等待時間 |
V$ROWCACHE |
顯示活動數據字典的統計 |
V$WAITSTAT |
列出塊競爭統計數據,只有當時間統計數據參數被「使能」時系統才能對其更新 |
|
|
& 說明:
有關Oracle數據字典的更多內容可以參考我的BLOG:http://blog.itpub.net/26736162/viewspace-2153324/
本文選自《Oracle程式設計師面試筆試寶典》,作者:李華榮。