承接上篇,本文深入列舉靜態資料字典視圖的三大前綴(user_/all_/dba_)代表意義,並詳細介紹動態效能視圖(V$ 系列)的分類與高頻使用場景,附贈 15 條實戰查詢腳本。
| 前綴 | 說明 | 典型查詢 |
|---|---|---|
user_* | 當前 Schema 擁有的物件 | SELECT * FROM user_tables; |
all_* | 當前用戶可存取的物件(含其他 Schema) | SELECT owner, object_name FROM all_objects WHERE object_type='TABLE'; |
dba_* | 全資料庫所有物件(需 DBA 權限) | SELECT * FROM dba_data_files; |
-- 物件清單
SELECT * FROM user_tables; -- 表
SELECT * FROM user_indexes; -- 索引
SELECT * FROM user_views; -- 視圖
SELECT * FROM user_objects; -- 所有物件(含類型)
SELECT * FROM user_users; -- 當前用戶資訊
-- 跨 Schema 查詢
SELECT owner, object_name, object_type
FROM all_objects
WHERE owner = 'HR';
-- 表空間與檔案(需 DBA)
SELECT * FROM dba_data_files;
SELECT * FROM dba_free_space;
動態視圖反映**記憶體結構**即時狀態,僅供讀取,資料庫重啟即重置。主要分類:
| 分類 | 代表視圖 | 用途 |
|---|---|---|
| Session / Process | V$SESSION, V$PROCESS | 連線監控、長跑 SQL、鎖等待 |
| SQL / Cursor | V$SQLAREA, V$SQL, V$SQL_PLAN | 執行計畫、共享游標、解析統計 |
| Instance / RAC | V$INSTANCE, V$ACTIVE_INSTANCE | 實例狀態、RAC 節點存活 |
| Memory / SGA | V$SGA, V$SGASTAT, V$PGASTAT | 記憶體配置、快取命中率 |
| Lock / Enqueue | V$LOCK, V$ENQUEUE_STAT | 阻塞鏈、死鎖分析 |
| Undo / Redo | V$UNDOSTAT, V$LOG, V$ARCHIVED_LOG | Undo 保留、Redo 切換、歸檔狀態 |
| Wait Events | V$SESSION_WAIT, V$SYSTEM_EVENT | 等待事件統計、效能瓶頸 |
| Context / Application | V$CONTEXT | Session 屬性、命名空間 |
-- 1. 當前所有 Session 詳細資訊
SELECT sid, serial#, username, machine, program, status, logon_time
FROM v$session WHERE type != 'BACKGROUND';
-- 2. 正在執行的 SQL(含執行計畫)
SELECT s.sid, s.sql_id, sq.sql_text, sq.plan_hash_value
FROM v$session s JOIN v$sql sq ON s.sql_id = sq.sql_id
WHERE s.status = 'ACTIVE' AND s.type != 'BACKGROUND';
-- 3. 找出阻塞鏈
SELECT blocking_session, sid, serial#, wait_class, seconds_in_wait
FROM v$session WHERE blocking_session IS NOT NULL;
-- 4. 系統級等待事件 Top 10
SELECT event, total_waits, time_waited_micro/1000000 sec
FROM v$system_event WHERE wait_class != 'Idle'
ORDER BY time_waited_micro DESC FETCH FIRST 10 ROWS ONLY;
-- 5. Shared Pool 佔用前 20 大 SQL
SELECT sql_id, executions, buffer_gets, sql_text
FROM v$sqlarea ORDER BY buffer_gets DESC FETCH FIRST 20 ROWS ONLY;
-- 6. 歸檔日誌產生趨勢(每小時)
SELECT trunc(first_time,'HH24') hr, count(*) cnt, round(sum(blocks*block_size)/1024/1024,2) mb
FROM v$archived_log WHERE first_time > sysdate-7
GROUP BY trunc(first_time,'HH24') ORDER BY hr;
-- 7. Undo 保留時間檢查
SELECT max(tuned_undoretention) max_retention FROM v$undostat;
-- 8. PGA 記憶體使用狀況
SELECT name, value/1024/1024 mb FROM v$pgastat WHERE name IN ('aggregate PGA target parameter','total PGA allocated');
-- 9. 檢查 RAC 節點狀態
SELECT instance_number, instance_name, host_name, status FROM v$active_instance;
-- 10. 當前 Session 的 Client Info / Module / Action
SELECT sid, module, action, client_info FROM v$session WHERE sid = SYS_CONTEXT('USERENV','SID');
-- 11. 物件鎖定詳情
SELECT o.object_name, l.locked_mode, s.sid, s.serial#, s.username
FROM v$locked_object l
JOIN v$session s ON l.session_id = s.sid
JOIN dba_objects o ON l.object_id = o.object_id;
-- 12. 表空間使用率
SELECT tablespace_name,
round(used_space*block_size/1024/1024,2) used_mb,
round(tablespace_size*block_size/1024/1024,2) total_mb,
round(used_percent,2) pct_used
FROM dba_tablespace_usage_metrics;
-- 13. 參數目前值
SELECT name, value FROM v$parameter WHERE name IN ('sga_target','pga_aggregate_target','processes','open_cursors');
-- 14. 當前資料庫版本與補丁
SELECT * FROM v$version;
-- 15. 彈性查詢:任意 V$ 視圖結構
SELECT * FROM v$fixed_table WHERE name LIKE 'V$%SESSION%';
GRANT SELECT_CATALOG_ROLE TO monitor_user; 避免給 DBA 角色。V$ 視圖影響極小,但避免在高峰期跑全表掃描的複雜聯結。V$FIXED_TABLE 發現新視圖:SELECT name FROM v$fixed_table WHERE name LIKE 'V$%WAIT%';靜態字典管「結構」,動態視圖管「運行」。兩手都要抓、兩手都要硬,才是合格的 Oracle DBA。