query_rewrite_enabled必须设为true或force,否则查询重写完全不生效;需全局设置参数、物化视图ddl显式声明enable query rewrite、会话设置query_rewrite_integrity匹配约束状态,并验证执行计划中物化视图名是否出现。

QUERY_REWRITE_ENABLED 必须设为 TRUE 或 FORCE,否则查询重写完全不生效——这是最常被忽略的前提,连物化视图加了 ENABLE QUERY REWRITE 也没用。
确认并设置全局参数 query_rewrite_enabled
该参数控制整个实例是否允许重写。即使单个物化视图启用了重写,若此参数为 FALSE,优化器直接跳过所有重写尝试。
- 查当前值:
SHOW PARAMETER query_rewrite_enabled - 若为
FALSE,需由 DBA 执行:ALTER SYSTEM SET query_rewrite_enabled = TRUE;(或FORCE) -
FORCE模式会绕过成本评估,强制使用物化视图(适合已知物化视图明显更优的场景),但可能在某些低基数查询中反而变慢 - 注意:10g 及以后版本默认是
TRUE,但升级/克隆库后可能被重置
创建物化视图时必须显式声明 ENABLE QUERY REWRITE
仅靠参数开启不够,每个要参与重写的物化视图都必须在 DDL 中包含该子句,否则优化器视而不见。
- 正确写法:
CREATE MATERIALIZED VIEW mv_emp_dept ENABLE QUERY REWRITE AS SELECT ... - 错误写法:漏掉
ENABLE QUERY REWRITE,或写成ENABLE QUERY REWRITE TRUE(语法错误) - 如果已有物化视图没加该子句,不能 ALTER 修改,只能
DROP后重建 - 物化视图日志(
MATERIALIZED VIEW LOG)不是重写必需项,但影响能否支持FAST刷新——和重写本身无关
会话级完整性模式必须匹配物化视图状态
重写是否发生,还取决于 query_rewrite_integrity 设置与物化视图当前数据新鲜度、约束可信度是否兼容。
- 常用会话设置:
ALTER SESSION SET query_rewrite_integrity = TRUSTED; -
TRUSTED要求:物化视图已BUILD IMMEDIATE、基表有RELY约束、维度关系已声明;它允许重写基于未强制校验的关系 -
ENFORCED(默认)只信任 Oracle 强制执行的约束(如主键、外键),对多数自定义聚合物化视图过于保守,常导致重写失败 - 若物化视图被标记为
STALE(例如未刷新),TRUSTED和ENFORCED都会拒绝重写,除非设为STALE_TOLERATED(12c+ 支持实时计算)
验证重写是否实际触发
光看执行计划还不够,得确认优化器真用了物化视图,而不是走原表。
- 开启执行计划追踪:
SET AUTOTRACE ON EXPLAIN,然后运行基表查询 - 检查 Plan 中的
OBJECT_NAME是否出现你的物化视图名(如MV_EMP_DEPT),而非原表名 - 若看到
VIEW操作符下挂的是物化视图名,且Operation是TABLE ACCESS FULL或带索引访问,说明重写成功 - 常见失败信号:Plan 显示原表名 +
MERGE JOIN/HASH JOIN,或 Plan Hash Value 和建 MV 前完全一致
ENABLE QUERY REWRITE,但会话仍用默认 ENFORCED 模式,且基表没建 RELY 约束——此时重写静默失效,连警告都不报。











