X$ 視圖介紹

不使用SQL而訪問SGA有兩個先決條件:C語言和x$視圖。這裏,我們會讓你瞭解x$的內存結構,但C語言則不是本書要講述的內容。

X$數據結構是Oracle數據庫管理系統(DBMS)的核心。在數據庫管理系統的內核中,他們是處於不斷變化中的內存結構,保存着實例(Instance)運行期間的各種統計信息。所以,如果你的實例已經運行了好幾個月,某些統計值可能會因爲太大而循環計數了,這些值一般可以忽略掉。X$視圖的內容一般只存在於內存中,你不可能將他們導出到其他得數據庫中,因爲他們在數據字典中沒有相關信息。他們也不像普通的表那樣可以設置存儲參數,但是某些固定的列上可以有索引。

X$視圖的名字都是以K開頭,表示內核(kernel)。初看起來,他們似乎沒有規律,實際上,他們的名字是有規律可循的。X$視圖的詳細信息並沒有相關的描述文檔,而且各個版本也可能不一樣。

Oracle的內核是分層結構的,相互之間保持獨立,控制信息在不同層之間傳遞。每一層都有一組x$內存結構。下面列出了oracle內核中的層。

 KK 編譯層(Comlication layer)
 KX 執行層(Execution layer)
 K2 分佈式事務層(Distributed Transaction layer)
 KZ 安全層(Security layer)
 KQ 查詢層(Query layer)
 KA 訪問層(Access layer)
 KD 數據層(Data layer)
 KT 事務層(Transaction layer)
 KC 緩存層(Cache layer)
 KS 服務層(Service layer)
 KJ 鎖管理層(Lock Management layer)
 KG一般層(Generic layer)

編譯層(KK)主要負責PL/SQL對象的編譯,基於數據字典統計信息的執行計劃的生成。編譯層的主要組件就是oracle的優化器(Optimizer)。
執行層(KX)執行上層編譯好的代碼,綁定SQL和PL/SQL對象,同時也負責執行對數據字典的遞歸SQL調用以及共享池(shared pool)中的遊標(cursor)管理。

分佈式事務層(K2)處理分佈式事務中的兩階段提交(two-phase commits)。兩階段提交(準備和提交)是保證分佈式事務的數據完整性的一種機制。

安全層(KZ)用於輔助上面的兩層在編譯和執行期間的權限處理,主要是管理角色和系統權限。

查詢層(KQ)在數據字典緩存中緩存數據字典。在編譯期間,編譯層(KK)和安全層(KZ)需要從查詢層讀取數據。

訪問層(KA)負責訪問數據段(segment),並給上面的層提供數據。

數據層(KD)控制物理數據在段中的存儲以及讀取。還控制着用戶存儲表數據和索引數據的數據段的格式化。

事務層(KT)主要的組件就是回滾段(rollback segment)。控制着自由空間列表(freelists)的管理,數據塊(data block)中事務列表(ITL)的分配,事務期間的行級鎖定(row-level lock)已經回滾數據(undo)的生成。還負責回滾段的分配和事務一致性的管理。

緩存層(KC)管理數據緩衝區(database buffer cache)。本層和操作系統關係緊密,管理着緩衝區和共享內存。同時還負責重做(redo)的生成已經將重做日誌寫入到重做日誌文件。

服務層(KS)爲其他的層提供必要的服務。在實例和會話級應用初始化參數。控制着單個實例的閂鎖latch分配和鎖(lock)管理。並且維護實例級的等待時間和統計信息。

鎖管理層(KJ)管理RAC環境的鎖和資源。維護着全局緩衝鎖(buffer lock),而不是表鎖或者行級鎖。

在你利用x$視圖直接從SGA獲取信息前,有必要澄清一些關於x$的常見的誤解。

誤解一:在一個負荷很重的系統中,你不應該查詢x$視圖。
事實:查詢x$大部分時候是安全的。幾乎所有的v$視圖都是基於一個或多個x$視圖的。如果有什麼區別的話,繞過v$而直接查詢x$代價更低。

誤解二:你不應該經常查詢x$視圖,因爲訪問後x$的內容會被清除。
事實:只有X$KSMLRU(Kernel Serveice layer Memory-omponent Least Recently Used)會在查詢後清空。其他的x$並不會在查詢後清空其內容。

誤解三:你不能對x$視圖執行DML操作,否則將導致實例崩潰
事實:即使你試圖對x$視圖執行DML操作,你也不可能成功。Oracle是不會允許你這麼做的。當然,通過某些手段可以清除或者重設某些x$視圖,但那並不是DML操作了。

誤解四:在實際生活中,你沒有必要訪問x$視圖。因爲機會所有的x$視圖信息都能通過查詢v$視圖獲得。
事實:v$視圖只暴露了x$視圖的一部分信息。對於一些高級的統計信息和內部信息,你仍然需要通過x$獲取。例如,共享池內存塊(chunks)的大小和塊的接觸點計數(touch count)都只能通過x$視圖獲得。

誤解五:只有sys用戶能訪問x$視圖。所以,爲了獲得x$視圖的信息,必須以sys身份登陸數據庫
事實:這並不完全正確。你可以以SYS的身份創建基於x$的視圖,然後將對創建的視圖的select權限賦予其他用戶,然後其他非DBA的用戶就可以查詢這些視圖了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章