Oracle 物化视图 Rewrite 详解
Oracle 物化视图 Rewrite 详解
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
物化视图 Rewrite 自动重写查询使用物化视图[1]:
详细见:Oracle 物化视图性能优化。
2. 原理
2.1 Query Rewrite
- 用户查询
- 优化器检查
- 可用物化视图
- 重写
- 加速
2.2 透明
- 应用无感知
- 自动
- 性能提升
3. 启用
3.1 参数
ALTER SESSION SET query_rewrite_enabled = TRUE;
ALTER SESSION SET query_rewrite_integrity = enforced;
3.2 物化视图
CREATE MATERIALIZED VIEW mv_sales
ENABLE QUERY REWRITE
AS
SELECT dept_id, SUM(amount) AS total
FROM sales
GROUP BY dept_id;
4. 完整性
4.1 ENFORCED(默认)
- 完全一致
- 必须有效
- 最严格
4.2 TRUSTED
- 信任维度
- 必须启用
4.3 STALE_TOLERATED
- 容忍过期
- 最新不保证
- 性能
5. 维度
5.1 创建
CREATE DIMENSION time_dim
LEVEL day IS times.day
LEVEL month IS times.month
LEVEL year IS times.year
HIERARCHY time_rollup (
day CHILD OF month CHILD OF year
)
ATTRIBUTE month DETERMINES month_name;
5.2 信任
-- TRUSTED 模式
ALTER SESSION SET query_rewrite_integrity = trusted;
6. 查看
6.1 视图
SELECT * FROM user_mviews;
SELECT * FROM user_mview_analysis;
SELECT * FROM user_mview_keys;
6.2 Rewrite
SELECT * FROM v$mystat WHERE statistic# = ...;
-- 查询是否使用
EXPLAIN PLAN FOR SELECT ...;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY));
-- MAT_VIEW REWRITE ACCESS FULL
7. 刷新
7.1 ON DEMAND
CREATE MATERIALIZED VIEW mv1
REFRESH ON DEMAND COMPLETE
AS SELECT ...;
7.2 ON COMMIT
CREATE MATERIALIZED VIEW mv1
REFRESH ON COMMIT FAST
AS SELECT ...;
7.3 手动
EXEC DBMS_MVIEW.REFRESH('MV_SALES');
EXEC DBMS_MVIEW.REFRESH_DEPENDENT(...);
EXEC DBMS_MVIEW.REFRESH_ALL_MVIEWS(...);
8. FAST 刷新
8.1 物化视图日志
CREATE MATERIALIZED VIEW LOG ON sales
WITH ROWID, SEQUENCE (dept_id, amount)
INCLUDING NEW VALUES;
8.2 条件
- 仅聚合
- JOIN 限制
- 子查询限制
- 测试
9. 应用场景
9.1 数据仓库
- 聚合预计算
- 查询加速
- 透明
9.2 报表
- 复杂报表
- 物化视图
- 性能
9.3 汇总
- 日/周/月汇总
- 物化视图
- 自动使用
10. 性能
10.1 优势
- 预计算
- 查询加速
- 透明
10.2 开销
- 刷新开销
- 存储
- 监控
11. 监控
11.1 使用
SELECT name, value FROM v$sysstat
WHERE name LIKE '%rewrite%';
11.2 失效
SELECT mview_name, staleness, last_refresh_type, last_refresh_date
FROM user_mviews;
11.3 性能
SELECT sql_id, executions, elapsed_time
FROM v$sql
WHERE plan_hash_value IN (
SELECT plan_hash_value FROM v$sql_plan
WHERE operation = 'MAT_VIEW REWRITE ACCESS'
);
12. 常见问题
12.1 不 Rewrite
- query_rewrite_enabled
- 完整性级别
- 物化视图有效
12.2 STALE
- 未刷新
- 刷新
- ENFORCED 模式
12.3 性能
- 选择性
- 监控
- 调优
13. 最佳实践
- 聚合场景:物化视图
- ENABLE QUERY REWRITE:必须
- FAST 刷新:增量
- 完整性:场景
- 维度:信任
- 监控:使用
- 测试:Rewrite
- 刷新:定期
- 文档:配置
- 演练:定期
14. 参考资料
[1] Oracle Database Data Warehousing Guide 19c, “Query Rewrite” https://docs.oracle.com/en/database/oracle/oracle-database/19/dwh/