必须将QUERY_REWRITE_ENABLED设为TRUE或FORCE,否则物化视图永不参与重写;即使设为TRUE仍不生效,常见原因是会话级未启用、参数值为字符串需正确查询、生产环境未同步配置,以及QUERY_REWRITE_INTEGRITY设置过严或约束未验证。

必须把 QUERY_REWRITE_ENABLED 设为 TRUE 或 FORCE,否则物化视图永远不参与重写——这是硬性前提,不是可选项。
为什么 QUERY_REWRITE_ENABLED=TRUE 还不生效?
常见现象是参数查出来是 TRUE,但执行计划里完全看不到物化视图名。根本原因不是“没配对”,而是:
- 会话级设置被覆盖:应用连接池默认启动时没执行 ALTER SESSION SET QUERY_REWRITE_ENABLED = TRUE,实际沿用系统默认(某些版本默认 FALSE)
- 参数值是字符串,不是布尔:查 V$PARAMETER 时得用 SELECT VALUE FROM V$PARAMETER WHERE NAME = 'query_rewrite_enabled',返回的是 'TRUE' 字符串,别误判成数字或空值
- 生产环境没同步:开发库改了 ALTER SYSTEM,但生产库仍为初始值,且无自动同步机制
QUERY_REWRITE_INTEGRITY 的三个值怎么选?
这个参数决定优化器“敢不敢信”物化视图的数据和约束关系,直接影响重写触发率:
- ENFORCED(默认):要求基表主键/外键已 VALIDATED,且存在对应物化视图日志;缺一不可,最安全但最难满足
- TRUSTED:允许基表约束为 RELY ENABLE NOVALIDATE,也接受预建物化视图;适合多数报表场景,启用后重写概率明显上升
- STALE_TOLERATED:连物化视图过期(STALE 状态)都允许重写;仅限离线分析类查询,线上 OLTP 不建议
实操建议:
- 先在会话级试 ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED,验证是否命中
- 若确认数据一致性可控,再用 ALTER SYSTEM 全局设为 TRUSTED
- 别设 FORCE 给 QUERY_REWRITE_ENABLED:它会跳过成本评估,强制重写,可能让简单查询反而变慢
哪些参数组合容易踩坑?
以下组合看似合理,实际常导致重写失效:
- QUERY_REWRITE_ENABLED=TRUE + QUERY_REWRITE_INTEGRITY=ENFORCED,但基表约束没 VALIDATE(报 ORA-30353 或静默跳过)
- QUERY_REWRITE_ENABLED=TRUE + 物化视图没建日志(REFRESH FAST 场景下,ORA-23413 直接阻断)
- 应用使用连接池(如 Druid、UCP),只在初始化时设一次参数,后续会话未继承 QUERY_REWRITE_ENABLED 设置
- 同时设了 OPTIMIZER_MODE=FIRST_ROWS:CBO 成本模型被弱化,重写判断逻辑可能降级
关键点:参数生效是会话级行为,而物化视图重写决策发生在 SQL 解析阶段——如果那个会话的参数不对,哪怕 MV 定义完美、数据新鲜,也白搭。


















