物化视图查询重写需同时满足全局参数QUERY_REWRITE_ENABLED=TRUE、对象级ENABLE QUERY REWRITE启用、语义等价、状态合法(NOT STALE)、统计信息完备及权限充足,执行计划出现MATERIALIZED VIEW REWRITE才表明生效。
带聚合函数的视图在 Oracle 中默认不走物化视图重写,除非显式启用并满足严格条件。
为什么
加
后物化视图不自动重写?
Oracle 的查询重写(Query Rewrite)对聚合视图有硬性限制:基础表必须通过
显式分组,且物化视图定义中必须包含
+ 完整的维度键(如时间、产品 ID),否则优化器直接忽略重写。常见错误是只建了物化视图但没在源视图里声明可重写,或维度列缺失/类型不一致。
这类视图才可能被重写;
(无
)无法匹配任何带分组的物化视图
物化视图必须用
或
,且含
,否则即使结构匹配也不触发
会话级需开启
,否则无视该功能
如何让
暴露真实失败原因?
直接查
输出比看执行计划更准——它会逐条列出“为什么没重写”。关键不是看是否成功,而是看
字段和
内容。
oracle知识库
oracle知识库下载
下载
运行前先建解释表:
查结果:
典型报错:
说明物化视图名/owner 不匹配;
表示视图中的
列未在物化视图 SELECT 列中完整出现
维度表必须参与 JOIN 才能启用星型重写(Star Transformation)?
不是必须,但若想让聚合视图自动利用维度层次(如年→季度→月),物化视图必须显式包含维度表的主键列,并用
关联而非
过滤。Oracle 的星型重写机制只识别标准星型模式(事实表 + 外键指向维度表)。
正确写法:
错误写法:
—— 此时维度逻辑被隐藏,重写失效
物化视图上需对维度列建位图索引(
),否则星型重写不激活
真正卡住性能的往往不是聚合本身,而是物化视图刷新锁表、维度列空值导致重写跳过、或者会话级
被应用连接池默认关闭——这些细节比语法更影响落地效果。
CREATE VIEWSUM()GROUP BYENABLE QUERY REWRITESELECT dept_id, SUM(salary) FROM emp GROUP BY dept_idSELECT SUM(salary) FROM empGROUP BYREFRESH FAST ON COMMITON DEMANDENABLE QUERY REWRITEALTER SESSION SET QUERY_REWRITE_ENABLED = TRUEDBMS_MVIEW.EXPLAIN_REWRITEEXPLAIN_REWRITEREWRITE_MECHANISMMESSAGEEXEC DBMS_MVIEW.EXPLAIN_REWRITE('SELECT * FROM sales_summary_v', 'SALES_SUMMARY_MV')SELECT message FROM rewrite_table WHERE rewrite_reason = 'FAILED'"No suitable materialized view found""Grouping column missing"GROUP BYJOINWHEREFROM sales s JOIN time_dim t ON s.time_id = t.time_id GROUP BY t.year, t.quarterFROM sales s WHERE s.time_id IN (SELECT time_id FROM time_dim WHERE year = 2023)CREATE BITMAP INDEX idx_t_year ON time_dim(year)QUERY_REWRITE_ENABLED