一、物化視圖 vs 普通視圖
| 特性 | 普通視圖 | 物化視圖 |
| 存儲 | 虛擬表(僅存 SQL 定義) | 物理表(佔用段、磁盤空間) |
| 查詢性能 | 每次展開 SQL 執行 | 直接讀取預計算結果 |
| 數據一致性 | 實時 | 取決於刷新策略 |
| 適用場景 | 簡單查詢、實時性要求高 | 複雜聚合、頻繁查詢、OLAP/報表 |
二、創建最簡單物化視圖(ON DEMAND 默認)
CREATE MATERIALIZED VIEW mv_testcf AS
SELECT * FROM xiaotg.testcf;
驗證物理屬性
-- 可從 USER_TABLES 查詢,證明是物理表
SELECT table_name, num_rows FROM user_tables WHERE table_name IN ('TESTCF','MV_TESTCF');
-- 結果:MV_TESTCF 80000 行,TESTCF 80000 行
-- 佔用段空間
SELECT segment_name, bytes FROM user_segments WHERE segment_name = 'MV_TESTCF';
三、兩種刷新模式深度對比
| 維度 | ON DEMAND | ON COMMIT |
| 觸發方式 | 手動 DBMS_MVIEW.REFRESH 或排程 | 基表事務 COMMIT 時自動觸發 |
| 數據延遲 | 分鐘~天級 | 近實時(毫秒級) |
| 主庫影響 | 極小 | 增加 COMMIT 延遲(需應用刷新) |
| 並發風險 | 無 | 可能導致主表鎖爭用 |
| 適用場景 | 報表、數據集市、容忍延遲 | 緩存表、少量 DML 的參考數據 |
四、刷新方法選擇
- FAST REFRESH:需物化視圖日志(
CREATE MATERIALIZED VIEW LOG ON base_table),僅應用增量變化,極快;
- COMPLETE REFRESH:截斷重建,無需日志,耗時與全量查詢相當;
- FORCE REFRESH:嘗試 FAST,失敗則 COMPLETE。
五、手動刷新示例
-- 完全刷新
EXEC DBMS_MVIEW.REFRESH('MV_TESTCF', 'C');
-- 快速刷新(需預建日志)
EXEC DBMS_MVIEW.REFRESH('MV_TESTCF', 'F');
六、進階特性預覽
- 查詢重寫:
QUERY_REWRITE_ENABLED=TRUE,優化器自動將查詢重定向至物化視圖;
- 分區物化視圖:大數據集分區刷新、分區裁剪;
- 嵌套物化視圖:多層聚合預計算。
總結
物化視圖以空間換時間,核心決策點:刷新模式(ON DEMAND/ON COMMIT)+ 刷新方法(FAST/COMPLETE)。新手從 ON DEMAND + COMPLETE 起步,逐步引入 MV LOG 實現 FAST REFRESH。