­

【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程式設計師面試筆試寶典》,作者:李華榮。