日常使用 V$SESSION 等動態視圖,偶見 V_$SESSION、GV$SESSION 寫法,DESC 結構相同。另有 X$ 開頭物件。它們究竟是什麼關係?
| 層級 | 前綴 | 本質 | 說明 |
|---|---|---|---|
| 基礎表 | X$ | 固定表 (Fixed Table) | 直接映射 SGA 共享記憶體結構,非資料字典表,不可修改 |
| 實例級視圖 | V$ / V_$ | 視圖 | 封裝 X$ 表,單實例視角,V$ 為 V_$ 同義詞 |
| 叢集級視圖 | GV$ | 視圖 | RAC 環境下跨所有實例彙總,含 INST_ID 欄位 |
SQL> DESC V$FIXED_TABLE;
NAME NULL? TYPE
------------ -------- ------------
NAME VARCHAR2(30)
OBJECT_ID NUMBER
TYPE VARCHAR2(5) -- TABLE / VIEW
TABLE_NUM NUMBER
SQL> SELECT * FROM V$FIXED_TABLE WHERE NAME LIKE 'V$SESSION%';
NAME OBJECT_ID TYPE TABLE_NUM
------------ ----------- ----- ----------
GV$SESSION 4294951xxx VIEW 65537
V$SESSION 4294950xxx VIEW 65537
X$KSUSE 4294950xxx TABLE 0 -- 底層固定表
SQL> SET LINESIZE 200
SQL> COL VIEW_NAME FOR A20
SQL> COL VIEW_DEFINITION FOR A100
SQL> SELECT * FROM V$FIXED_VIEW_DEFINITION WHERE VIEW_NAME = 'V$SESSION';
VIEW_NAME VIEW_DEFINITION
----------- ------------------------------------------------------------------
V$SESSION SELECT ... FROM X$KSUSE WHERE ...
可見 V$SESSION 直接查詢底層固定表 X$KSUSE(Session 狀態資訊)。
X$KSUSE (Fixed Table, SGA 記憶體映射)
│
├─► V_$SESSION (View, 實例級)
│ │
│ └─► V$SESSION (Public Synonym → V_$SESSION)
│
└─► GV$SESSION (View, 叢集級)
│
└─► SELECT * FROM V_$SESSION@instance_link UNION ALL ...
(含 INST_ID 欄位區分實例)
V$ 為公共同義詞指向 V_$,慣用 V$ 即可INST_ID=1| X$ 表 | 對應 V$ 視圖 | 用途 |
|---|---|---|
| X$KSUSE | V$SESSION | Session 狀態 |
| X$KSLED | V$LATCH | 閂統計 |
| X$KSLWT | V$LATCH_WAIT | 閂等待 |
| X$KSQEQ | V$ENQUEUE_STAT | 佇列鎖 |
| X$KCBFWAIT | V$WAITSTAT | 緩衝等待 |
| X$KSMFSV | V$SGASTAT | SGA 記憶體分佈 |
DBA 可建立自訂視圖封裝常用 X$ 聯結邏輯:
CREATE OR REPLACE VIEW my_session_wait AS
SELECT s.sid, s.serial#, s.username, s.sql_id, w.event, w.wait_time, w.seconds_in_wait
FROM v$session s, v$session_wait w
WHERE s.sid = w.sid
AND s.username IS NOT NULL;
再授權 GRANT SELECT ON my_session_wait TO monitor_role; 供監控工具使用。
理解 X$→V$/V_$→GV$ 三層架構,是從「會用視圖」進階到「懂架構、能封裝、敢優化」的關鍵認知躍升。