在上篇文章里“走近Oracle數據字典--數據字典表”,我們談到了數據字典對于我們作為DBA對數據庫維護的重要性。數據庫的對象信息,比如表,用戶,存儲過程,函數,視圖,索引等等,這些存在在數據庫里的對象的信息,都是在數據字典表里進行維護的,我們可以借用一些比較好的Oracle開發工具比如PLSQL dev或者TOAD查看他們,或者直接通過對數據字典表進行sql查詢,從而獲得對象的信息。 不過在數據庫的meta信息里,除了這些對象靜態對象的這些信息以為,數據庫運行是的一些信息對于我們來說也是非常有幫助的,也更為有意義。 比如,有多少個session,有什么樣的PRocess在實例里運行,系統的狀態現在是如何的, 可以看到這些信息都是實例運行時的動態信息,不是固定的信息,不同的時刻可能信息也是不一樣的, Oracle為了進行維護的時候能夠得知這些實例的這些類似狀態一樣的動態的信息,提供叻動態性能視圖,通過這個動態性能視圖我們可以了解到實例內部的一些動態變化的狀態信息。
動態信息視圖也是數據字典的一種,提供信息維護的作用,不過和我們上一個文章提到的“數據字典表”一樣也可以在dictionary里找到,開頭為v$的都是我們這里提到的動態性能視圖。 一樣,這個是一個public的同義詞,我們以v$session這個大家比較熟悉的視圖為例,一起走進去看看。
SQL> select OWNER,OBJECT_NAME, OBJECT_TYPE from all_objects where object_name = 'V$SESSION';
OWNER OBJECT_NAME OBJECT_TYPE
------------------------------ ------------------------------ -------------------
PUBLIC V$SESSION SYNONYM
SQL> select OWNER,SYNONYM_NAME,TABLE_OWNER,TABLE_NAME from dba_synonyms where synonym_name = 'V$SESSION';
OWNER SYNONYM_NAME TABLE_OWNER TABLE_NAME
------------------------------ ------------------------------ ------------------------------ ------------------------------
PUBLIC V$SESSION SYS V_$SESSION
可以看到v$session是一個同義詞,指向v_$sesssion, 這個v_$sesssion才是一個視圖。
動態性能視圖都是以V$開頭,對應是以V_$開頭的視圖。 我們來看看這些V_$視圖的定義吧
還記得我嗎上篇文章,如何來查看view的基表的語句吧
可以查詢dba_views表的text字段
SQL> select view_name,text from dba_views a where a.view_name = 'V_$SESSION';
VIEW_NAME TEXT
------------------------------ --------------------------------------------------------------------------------
V_$SESSION select "SADDR","SID","SERIAL#","AUDSID","PADDR","USER#",......from v$session
這里可以看到 v_$session是一個視圖,他的基表是v$session,這里要注意這個v$session不是上面的同義詞了,而是一個和其名字一樣的視圖或者表。
既然是視圖我們再用dba_views來查查這個視圖是怎么定義的呀。
SQL> select view_name,text from dba_views a where a.view_name = 'V$SESSION';
VIEW_NAME TEXT
------------------------------ --------------------------------------------------------------------------------
發現并沒有這個名字的視圖,那么在表的里面查查
SQL> select table_name from dba_tables a where a.table_name = 'V$SESSION';
TABLE_NAME
------------------------------
也沒有這個對象, 究竟是怎么回事了,這個v$session就是是何物呀, 動態性能視圖和數據字典表不一樣,動態性能視圖不是真正的物理表,而是內存中虛擬出來的表,其實可以看作是Oracle的一部分內存,不過是用表的形式提供信息的,既然是這樣的,那么這個v$session當然就不會放到真實的表和視圖里了。
對于類似這樣的虛擬的內存表的信息,我們可以通過v$fixed_view_defination來查詢
SQL> desc v$fixed_view_definition;
Name Type Nullable Default Comments
--------------- -------------- -------- ------- --------
VIEW_NAME VARCHAR2(30) Y
VIEW_DEFINITION VARCHAR2(4000) Y
SQL> select * from v$fixed_view_definition where view_name = 'V$SESSION';
VIEW_NAME VIEW_DEFINITION
------------------------------ --------------------------------------------------------------------------------
V$SESSION select SADDR , SID , SERIAL# , AUDSID , PADDR , USER# , ..... from GV$SESSION where inst_id =USERENV('Instance')
發現這個視圖由GV$session定義而成 GV$Session和v$session一樣,有是一個虛擬表的視圖。
SQL> select * from v$fixed_view_definition where view_name = 'GV$SESSION';
VIEW_NAME VIEW_DEFINITION
------------------------------ --------------------------------------------------------------------------------
GV$SESSION select s.inst_id,s.addr,s.indx,s.ksuseser,s.ksuudses,s.ks ..... from x$ksuse s, x$ksled e where bitand(s.ksspaflg,1)!=0 and bitand(s.ksuseflg,1)!=0 and s.ksuSEOpc=e.indx
終于找到最后的源頭了,就是這里的X$開頭的對象,這里的對象x$開頭的就都是我們上面提到的虛擬表,是在內存里的部分,用表的形式展現而已。 Oracle把運行的狀態直接構造在內存里,這樣不必要去IO一把,而且用表的形式來表現,易于查詢。 同時既然是動態部分,那么這個地方是可變化的,數據庫停止的時候,這些內存表的信息也就消失叻,直到下次啟動,Oracle實例再根據實時的情況進行構造。
大家可以查詢一下v$fixed_table這個表,只所以在這里才給大家提出來,就是顧慮大家如果沒有區別上面的v$session(synonym),v_$session, v$session, gv$session, x$ksuse的話,直接看這個視圖就亂掉了,
現在大家可以查詢這個視圖了。 這個v$fixed_tables視圖就是所有的虛擬視圖和表。 也就是 v$session, gv$session, x$ksus這里的三種對象,而v$session(synonym),v_$session是實實在在的對象,所以這個視圖里查不到, 這個表里table表示是虛擬表, view表示是虛擬視圖。
他們一起構造出我們的性能動態視圖。 為什么Oracle不直接的在這些虛擬表上直接就見synonym而是,百轉千回的這樣繞了一下,大家有興趣可以思考一下,由于我這里沒有確切的答案,所以這個問題僅作為討論問題,就不在這里闡述叻。
這些動態性能視圖對于我們的Oracle DBA對數據庫進行管理,比較有意義。是我們DBA對Oracle的實例部分信息進行了解的一種通道。 所以掌握我們這里的重要的動態視圖非常的有必要, 下一篇文章, 我將視圖 給大家介紹DBA管理中常見的動態性能視圖。 通過了解具體的動態視圖來看看數據實例里我們關注的信息。