資料字典是 Oracle 的「元資料中樞」,記錄物件定義、空間分配、安全權限、運行統計等核心資訊。善用資料字典,能讓開發與管理事半功倍。本文系統梳理靜態資料字典(USER_/ALL_/DBA_ 三大前綴)與動態效能視圖(V$ 視圖),並提供高頻查詢範例。
所有字典表由 SYS 擁有,儲於 SYSTEM 表空間。表不可直接查詢,需透過視圖。
| 前綴 | 可見範圍 | 前提條件 | 典型使用者 |
|---|---|---|---|
USER_* | 當前使用者擁有的物件 | 無特殊權限 | 一般開發人員 |
ALL_* | 當前使用者有權限存取的物件 | 需被授予物件權限 | 跨 Schema 開發 |
DBA_* | 資料庫所有物件 | 需 DBA 權限或 SELECT ANY DICTIONARY | DBA、審計 |
三者資料結構一致,僅可見範圍不同。DBA_* 視圖對非 DBA 不可見。
| 視圖 | 用途 | 範例查詢 |
|---|---|---|
USER_USERS | 當前使用者屬性 | SELECT * FROM user_users; |
USER_TABLES | 擁有的表資訊 | SELECT table_name, tablespace_name FROM user_tables; |
USER_OBJECTS | 所有物件(表、視圖、程序、索引、序列...) | SELECT object_type, status FROM user_objects WHERE object_name = UPPER('package1'); |
USER_TAB_PRIVS | 表權限授予情況 | SELECT * FROM user_tab_privs WHERE table_name = UPPER('table1'); |
USER_TAB_COLUMNS | 欄位定義 | SELECT column_name, data_type, data_length FROM user_tab_columns WHERE table_name = UPPER('EMP'); |
USER_CONSTRAINTS | 約束條件 | SELECT constraint_name, constraint_type FROM user_constraints WHERE table_name = UPPER('EMP'); |
USER_INDEXES | 索引定義 | SELECT index_name, uniqueness FROM user_indexes WHERE table_name = UPPER('EMP'); |
USER_SEQUENCES | 序列屬性 | SELECT * FROM user_sequences; |
USER_SOURCE | PL/SQL 原始碼 | SELECT text FROM user_source WHERE name = UPPER('MY_PROC') ORDER BY line; |
USER_DEPENDENCIES | 物件相依關係 | SELECT * FROM user_dependencies WHERE name = UPPER('MY_VIEW'); |
關鍵提醒:字典視圖中物件名均為大寫,查詢時務必用 UPPER() 或直接寫大寫字串。
由系統維護,反映記憶體、進程、鎖、I/O 等運行時狀態,唯讀、持續更新,前綴 V$(或 GV$ RAC 環境)。
| 視圖 | 用途 | 關鍵欄位 |
|---|---|---|
V$SESSION | 當前 Session 詳細資訊 | SID, SERIAL#, USERNAME, MACHINE, SQL_ID, STATUS, LOGON_TIME |
V$SQL / V$SQLAREA | 共用池 SQL 文本與統計 | SQL_ID, SQL_TEXT, EXECUTIONS, BUFFER_GETS, DISK_READS, ELAPSED_TIME |
V$PROCESS | 背景/前台進程對應 | PID, SPID, PNAME, PROGRAM |
V$INSTANCE | 執行個體狀態 | INSTANCE_NAME, STATUS, STARTUP_TIME, HOST_NAME |
V$DATABASE | 資料庫屬性 | NAME, LOG_MODE, OPEN_MODE, DBID, CREATED |
V$SGA / V$SGASTAT | SGA 記憶體分配細目 | POOL, NAME, BYTES |
V$SYSTEM_EVENT / V$SESSION_EVENT | 等待事件統計 | EVENT, TOTAL_WAITS, TIME_WAITED_MICRO |
V$ACTIVE_SESSION_HISTORY | 活躍 Session 採樣(ASH) | SESSION_ID, SQL_ID, EVENT, WAIT_CLASS, SAMPLE_TIME |
V$ACCESS | 鎖定物件與存取 Session | SID, OWNER, OBJECT, TYPE |
V$CONTEXT | Session 上下文屬性 | NAMESPACE, ATTRIBUTE, VALUE |
-- 1. 找出耗資源 Top 10 SQL
SELECT sql_id, sql_text, executions, buffer_gets, elapsed_time/1e6 sec
FROM v$sqlarea
ORDER BY buffer_gets DESC
FETCH FIRST 10 ROWS ONLY;
-- 2. 當前阻塞會話
SELECT s.sid, s.serial#, s.username, s.machine, s.sql_id,
w.event, w.seconds_in_wait
FROM v$session s, v$session_wait w
WHERE s.sid = w.sid
AND s.blocking_session IS NOT NULL;
-- 3. SGA 元件大小
SELECT pool, name, round(bytes/1024/1024,2) mb
FROM v$sgastat
WHERE pool IS NOT NULL
ORDER BY pool, bytes DESC;
SELECT_CATALOG_ROLE 或特定 USER_* 視圖DBA_OBJECTS 等大視圖需加過濾條件靜態字典解決「結構是什麼」,動態視圖解決「運行怎麼樣」。DBA 腦中應建立字典視圖地圖:遇問題先想哪個視圖有答案,再寫 SQL 驗證。熟練 V$SESSION、V$SQL、V$SYSTEM_EVENT 三大核心視圖,已能解決 80% 效能與並發問題。