物化视图需同时满足 query_rewrite_enabled=true、mv定义含enable query rewrite、基表有主键或rowid、重写语义严格匹配,且必须用dbms_mview.explain_rewrite验证成功,否则不生效。
物化视图本身不会自动加速报表查询,哪怕建好了、刷出来了、索引也加了——只要 query_rewrite_enabled 是 false,优化器根本不会把它放进执行计划候选池。
为什么 EXPLAIN PLAN 看不到物化视图被重写?
这是最常被误判的环节。你执行 EXPLAIN PLAN FOR SELECT ...,发现执行计划里还是扫基表,不是 MV 没生效,而是优化器压根没考虑它。
-
EXPLAIN PLAN不反映查询重写决策,它只展示“如果不用重写,会怎么跑” - 必须用
DBMS_MVIEW.EXPLAIN_REWRITE显式验证:先运行EXEC DBMS_MVIEW.EXPLAIN_REWRITE('your_sql_here', 'mv_name');,再查REWRITE_TABLE(需提前运行UTLXRWY.SQL) - 关键看
REWRITE_MECHANISM字段:TEXT_MATCH或GENERAL才算成功;UNREWRITTEN表示语义不匹配,FAILED通常因权限或参数缺失 - 即使 MV 状态是
BUILD IMMEDIATE且REFRESH ON DEMAND,若QUERY_REWRITE_INTEGRITY设为ENFORCED但基表缺RELY约束,也会静默失败
QUERY_REWRITE_ENABLED 怎么开才真正起作用?
这个参数必须在 SQL 实际执行的会话上下文中为 TRUE,不是建 MV 时设了就完事。
- 全局开启(需 DBA 权限):
ALTER SYSTEM SET QUERY_REWRITE_ENABLED = TRUE; - 会话级开启(适合测试):
ALTER SESSION SET QUERY_REWRITE_ENABLED = TRUE; - 查当前值:
SELECT VALUE FROM V$PARAMETER WHERE NAME = 'query_rewrite_enabled';—— 返回是字符串'TRUE'或'FALSE',不是布尔值 - Spring Boot + HikariCP 场景下,连接复用导致会话不会自动执行
ALTER SESSION;开发环境手动开过,生产库没配,实际仍是FALSE
物化视图定义里漏了 ENABLE QUERY REWRITE 就白搭
没有这个子句,MV 就只是张普通表,/*+ REWRITE */ hint 会被优化器直接忽略。
- 正确写法:
CREATE MATERIALIZED VIEW mv_sales_daily ENABLE QUERY REWRITE AS SELECT ... - 错误写法:
CREATE MATERIALIZED VIEW mv_sales_daily REFRESH COMPLETE ON DEMAND AS SELECT ...(缺ENABLE QUERY REWRITE) - 已有 MV 漏了?不能
ALTER补,只能DROP后重建 - 兼容性硬要求:基表必须有主键,或 MV 定义中显式包含
ROWID,否则建时会报ORA-30353
Java 报表查询参数化后为何还是扫全表?
优化器不做逻辑等价推导,只做结构与语义的严格匹配。
- 你查
WHERE TO_CHAR(dt, 'YYYY-MM') = '2024-01',MV 存的是原始dt字段?不匹配 - 你加了
ORDER BY client_number,但 MV 上没建对应索引导致排序成本更高?优化器可能主动弃用 - 典型可重写场景:
SELECT client_number, SUM(amount) FROM sales WHERE dt >= DATE '2024-01-01' GROUP BY client_number,对应 MV 定义为SELECT client_number, dt, SUM(amount) FROM sales GROUP BY client_number, dt - 多维查询别堆一个“全能” MV;按高频模式拆分,例如
mv_sales_daily_region_prod(GROUP BY time_id, region, product_line)和mv_profit_monthly_region(用TRUNC(time_id, 'MM')而非TO_CHAR)
真正的复杂点不在语法是否写对,而在于:MV 的刷新策略是否跟得上业务数据变更节奏,以及重写是否真被触发——后者必须靠 DBMS_MVIEW.EXPLAIN_REWRITE 验证,不能靠猜。











