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. 最佳实践

  1. 聚合场景:物化视图
  2. ENABLE QUERY REWRITE:必须
  3. FAST 刷新:增量
  4. 完整性:场景
  5. 维度:信任
  6. 监控:使用
  7. 测试:Rewrite
  8. 刷新:定期
  9. 文档:配置
  10. 演练:定期

14. 参考资料

[1] Oracle Database Data Warehousing Guide 19c, “Query Rewrite” https://docs.oracle.com/en/database/oracle/oracle-database/19/dwh/