不使用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的用戶就可以查詢這些視圖了。
X$ 視圖介紹
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.