(轉)Oracle 動態效能檢視

xz43發表於2012-09-27
1.1 動態效能圖
動態效能檢視屬於資料字典,系統管理員使用者 SYS 可以訪問它們。
動態效能檢視在資料庫開啟和使用時不斷進行更新,而且它們的內容主要與效能有關。雖然這些檢視很像普通的資料庫表,但它們不允許使用者直接進行修改。這些檢視提供內部磁碟結構和記憶體結構方面的資料。使用者可以對這些檢視進行查詢,以便對系統進行管理與最佳化。
CATALOG.SQL 檔案包含這些檢視的定義以及公用同義詞,必須執行CATALOG.SQL 建立這些檢視及同義詞。升級系統也後要執行這個指令碼.
當資料庫管理員啟動某個例程時,資料庫會自動建立動態效能檢視;
當停止某個例程時,資料庫又會自動刪除這些動態效能檢視。
資料字典的資訊是從資料檔案中取得; 而動態效能檢視的資訊則是從SGA記憶體以及控制檔案中取得。所以,兩者所反映的資訊還是有很大差異的。資料庫管理員利用這些動態效能檢視,可以瞭解資料庫執行的一些基本資訊,為我們進行資料庫維護以及資料庫效能最佳化提供一些資料上的支援。
一般情況下,我們可以透過動態效能資料掌握兩類重要的資料庫執行資訊。
(1)瞭解資料庫執行相關的效能資料,如記憶體的使用量、磁碟排序發生的機率等等。
(2)取得與磁碟和記憶體結構相關的其他資訊。
在通常情況下,資料庫不同的狀態其動態效能檢視還是有比較大的差異:
(1)資料庫處於“NOMOUNT”狀態。資料庫啟動例程時,Oracle資料庫會開啟引數檔案,分配SGA記憶體並啟動後臺程式。此時,其實資料庫還沒有掛栽。此時,動態性呢檢視收集的資訊來源只有是SGA,而不會從控制檔案中收集相關的資訊。所以,動態效能檢視的數量要少得多。
(2)當資料庫處於MOUNT狀態時,資料庫會根據初始化引數開啟所有的控制檔案。所以,當例程處於Mount狀態時,動態效能檢視其收集到的資訊就要第一個狀態多的多。因為此時,動態效能檢視還會去收集控制檔案的相關資訊。不過,此時動態效能檢視所收集到的資料還不是最全的。
(3)當使用者開啟資料庫時,Oracle系統會根據控制檔案所記載的資訊去開啟所有的資料庫檔案以及重做日誌。此時,資料庫管理員除了可以從 SGA和控制檔案中獲取資訊的動態效能檢視外,還可能訪問與Oracle資料庫效能相關的動態效能檢視,如會話等待時間等檢視。另外需要注意一點,就是隻有在這個狀態時,我們才能夠訪問資料庫的資料字典檢視。
SYS owns the dynamic performance tables, whose names begin with V_$. Views are created on these tables, and then public synonyms prefixed with V$. For example, the V$DATAFILE view contains information about data files. The V$FIXED_TABLE view contains information about all of the dynamic performance tables and views.
從這段描述裡,我們可以理解,透過V$FIXED_TBLE 檢視可以檢視幾乎所有的動態效能表和檢視。 V$是V_$的同義詞。
1.2  V$, V_$, GV$,  X$ 檢視說明
1.2.1  X$ 表
X$表包含了特定例項的各方面的資訊,是Oracle資料庫的執行基礎,如當前的配置資訊,連線到例項的會話,以及豐富而有價值的效能資訊。 X$表並不是駐留在資料庫檔案的永久表或臨時表。X$表僅僅駐留在記憶體中,當例項啟動時,由Oracle應用程式動態建立,在記憶體中進行實時的維護。 它們中的大多數至少需要裝載或已經開啟的資料庫。X$表為SYS使用者所擁有,並且是隻讀的。 不能進行DML(更新,插入,刪除)。X$表對資料庫來說至關重要,所以Oracle不允許SYSDBA之外的使用者直接訪問,顯示授權不被允許。
可以從v$fixed_table中查到X$:
SQL>  select count(*) from v$fixed_table where name like 'X$%';
  COUNT(*)
----------
    945
在Oracle 11g共有945個X$表。
 
關於X$表,其建立資訊我們也可以透過bootstrap$表檢視,該表中記錄了資料庫啟動的基本及驅動資訊。
bootstrap$ 實際上儲存的是資料字典的基表的定義,如OBJ$,C_OBJ$,TAB$等等。Oracle透過讀取這些定義建立資料字典的基表,進而建立資料字典。
SQL> select * from bootstrap$;
bootstrap$ 部分比較深,有空在研究。
 
1.2.2  GV$ 和V$ 同義詞

1.2.2.1  V$ 檢視
動態效能檢視由字首V_$標識。這些檢視的公用同義詞具有字首V$。資料庫管理員或使用者應該只訪問V$物件,而不是訪問V_$物件。動態效能檢視由企業管理器和Oracle Trace 使用,Oracle Trace 是訪問系統效能資訊的主要介面。一旦例項啟動,從記憶體讀取資料的 V$檢視就可以訪問了。
注意: 每個V$檢視都包含類似語句:
where inst_id = USERENV('Instance')
用於限制返回當前例項資訊。
這一點我們可以透過V$FIXED_VIEW_DEFINITION 檢視 來驗證。如:
SQL>  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')
 
透過v$fixed_table 查詢V$檢視資訊:
SQL> select count(*) from v$fixed_table where name like 'V$%';
  COUNT(*)
----------
      525
1.2.2.2  GV$ 檢視
從Oracle8開始,GV$檢視開始被引入, GV$(Global V$,全域性V$)。除了一些特例以外(如:V$CACHE_LOCK、V$LOCK_ACTIVITY、V$LOCKS_WITH_COLLISIONS和V$ROLLNAME),每個V$檢視都有一個對應的GV$檢視存在。在並行伺服器環境下,可查詢GV$檢視從所有限定例項中檢索V$檢視的資訊。V$檢視和GV$檢視是相同的,V$比GV$只是少了INST_ID欄位。INST_ID 列顯示從其獲得相關的V$檢視資訊的例項號。INST_ID 列可用作一個從可得到的例項集檢索V$資訊的過濾器。
 
如:
SQL>SELECT * FROM GV$LOCK WHERE INST_ID = 2;
表示從例項2上的V$ 檢視中檢索資訊。
 
透過v$fixed_table 查詢GV$檢視資訊:
SQL> select count(*) from v$fixed_table where name like 'GV$%';
  COUNT(*)
----------
       496
從查詢結果看,GV$是496個,V$是525個,從這個結果可以證明:不是每個V$同義詞都有對應的GV$同義詞。
 
1.2.2.3  V$FIXED_VIEW_DEFINITION 檢視
透過 V$FIXED_VIEW_DEFINITION 檢視可以獲取組成V$檢視的底層X$表的所有資訊。
 
示例1.檢視V$FIXED_TABLE 檢視定義
SQL> 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')
 
從這裡,我們看到V$FIXED_TABLE基於GV$FIXED_TABLE建立。
 
示例2.檢視GV$FIXED_TABLE定義
SQL> 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 inst_id,kqfvinam, kqfviobj, 'VIEW', 65537 from x$kqfvi
union all select inst_id,kqfdtnam, kqfdtobj, 'TABLE', 65537 from x$kqfdt
從這裡,我們找到了GV$FIXED_TABLE檢視的建立語句,該檢視基於X$表建立。
示例3. 研究下V$PARAMETER 檢視
SQL> select view_definition from v$fixed_view_definition a where a.VIEW_NAME='V$PARAMETER';

VIEW_DEFINITION
-----------------------------------------------------------------------------------------------------------------------
SELECT   NUM,
         NAME,
         TYPE,
         VALUE,
         DISPLAY_VALUE,
         ISDEFAULT,
         ISSES_MODIFIABLE,
         ISSYS_MODIFIABLE,
         ISINSTANCE_MODIFIABLE,
         ISMODIFIED,
         ISADJUSTED,
         ISDEPRECATED,
         ISBASIC,
         DESCRIPTION,
         UPDATE_COMMENT,
         HASH
  FROM   GV$PARAMETER
 WHERE   inst_id = USERENV ('Instance')
從這裡,我們看到V$PARAMETER 是基於GV$PARAMETER 構造的。
 
SQL> select view_definition from v$fixed_view_definition a where a.VIEW_NAME='GV$PARAMETER';
 
VIEW_DEFINITION
--------------------------------------------------------------------------------------------------------------------------------------------------
SELECT   x.inst_id,
         x.indx + 1,
         ksppinm,
         ksppity,
         ksppstvl,
         ksppstdvl,
         ksppstdf,
         DECODE (BITAND (ksppiflg / 256, 1), 1, 'TRUE', 'FALSE'),
         DECODE (BITAND (ksppiflg / 65536, 3),
                 1, 'IMMEDIATE',
                 2, 'DEFERRED',
                 3, 'IMMEDIATE',
                 'FALSE'),
         DECODE (BITAND (ksppiflg, 4),
                 4, 'FALSE',
                 DECODE (BITAND (ksppiflg / 65536, 3), 0, 'FALSE', 'TRUE')),
         DECODE (BITAND (ksppstvf, 7),
                 1, 'MODIFIED',
                 4, 'SYSTEM_MOD',
                 'FALSE'),
         DECODE (BITAND (ksppstvf, 2), 2, 'TRUE', 'FALSE'),
         DECODE (BITAND (ksppilrmflg / 64, 1), 1, 'TRUE', 'FALSE'),
         DECODE (BITAND (ksppilrmflg / 268435456, 1), 1, 'TRUE', 'FALSE'),
         ksppdesc,
         ksppstcmnt,
         ksppihash
  FROM   x$ksppi x, x$ksppcv y
 WHERE   (x.indx = y.indx) AND BITAND (ksppiflg, 268435456) = 0
         AND ( (TRANSLATE (ksppinm, '_', '#') NOT LIKE '##%')
              AND (   (TRANSLATE (ksppinm, '_', '#') NOT LIKE '#%')
                   OR (ksppstdf = 'FALSE')
                   OR (BITAND (ksppstvf, 5) > 0)))
 
在這裡我們看到GV$PARAMETER來源於x$ksppi, x$ksppcv兩個X$表, x$ksppi, x$ksppcv 基本上包含所有資料庫可調整引數.
v$parameter展現的是不包含"_"開頭的引數。以"_"開頭的引數我們通常稱為隱含引數,一般不建議修改,但很多因為功能強大經常使用而廣為人知。

感興趣的,可以自己研究下V$FIXED_VIEW_DEFINITION 檢視,它是我們研究資料字典的一個入口。

1.2.3  GV_$, V_$檢視
動態效能的檢視是透過catalog.sql建立。當catalog.sql執行時:
create or replace view v_$fixed_table as select * from v$fixed_table;
create or replace public synonym v$fixed_table for v_$fixed_table;
create or replace view gv_$fixed_table as select * from gv$fixed_table;
create or replace public synonym gv$fixed_table for gv_$fixed_table;

我們注意到, 先建立 V_$和GV_$ 檢視,然後基於V_$檢視和GV_$檢視來建立V$和GV$同義詞。
所以,實際上通常我們訪問的V$檢視,其實是指向V_$檢視的同義詞。而V_$檢視是基於X$表建立的。關於這一點可以透過:v$fixed_view_definition檢視 來驗證。 在上面1.2.2 節有相關的示例。
訪問V$FIXED_VIEW_DEFINITION 檢視可以獲取組成V$檢視的底層X$表的所有資訊
SQL> select count(*) from v$fixed_table where name like 'GV_%';
  COUNT(*)
----------
    496
SQL> select count(*) from v$fixed_table where name like 'V_%';
  COUNT(*)
----------
     525
動態效能物件那麼多,如何來判斷某個物件到底是同義詞還是檢視呢? 可以透過如下SQL來實現:
SQL> select object_type from all_objects where object_name=upper('v$datafile');
OBJECT_TYPE
-------------------
SYNONYM

總結一下:在例項啟動時,會先建立X$表,然後基於X$表建立GV_$ 和 V_$ 檢視,在基於GV_$ 和V_$檢視建立GV$和V$同義詞。 我們一般查詢的都是同義詞。 關於這些檢視的定義,可以透過V$FIXED_VIEW_DEFINITION 檢視 來檢視。 在資料庫執行期間,動態效能檢視儲存在記憶體中,時刻監控著資料庫的狀態,我們在需要的時候可以檢視這些檢視。 當例項關閉時,資料庫又會從記憶體中自動刪除這些動態效能檢視。
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9399028/viewspace-745274/,如需轉載,請註明出處,否則將追究法律責任。

相關文章