oracle 23c 不提供自动识别并推荐物化视图的功能,已彻底移除 dbms_advisor 中的 sql access advisor;替代方案是手动用 dbms_mview.explain_mview 验证可行性,或结合 awr 与自定义脚本半自动挖掘候选 mv。

Oracle 23c 不提供自动识别并推荐物化视图的功能。 它没有内置的 AI 或自治模块来分析 SQL 负载、发现重复聚合/连接模式、并生成 CREATE MATERIALIZED VIEW 建议——这和自动索引(AUTO_INDEX_MODE)不同,后者虽已重构但至少保留了 DBMS_AUTO_INDEX.REPORT_LAST_ACTIVITY 接口;而物化视图推荐在 23c 中完全不存在对应机制。
为什么 DBMS_ADVISOR 和 SQL Access Advisor 在 23c 中不可用
Oracle 23c 已正式移除 DBMS_ADVISOR 包中的 SQL Access Advisor(即物化视图/索引推荐器)。该组件自 19c 起进入 deprecated 状态,23c 彻底删除:
- 调用
DBMS_ADVISOR.CREATE_TASK('SQLACCESS_ADVISOR')会报错ORA-13600: error message from the advisor: E-13627 -
dba_advisor_tasks视图中不再包含SQLACCESS_ADVISOR类型任务 - Oracle Database 23c 文档中已无 “SQL Access Advisor” 章节,仅保留对旧版兼容性说明
替代方案:用 DBMS_MVIEW.EXPLAIN_MVIEW 手动验证可行性
虽然不能自动推荐,但你能用 EXPLAIN_MVIEW 快速判断一个已有查询是否适合改造成物化视图,并确认它能否支持快速刷新(FAST)或查询重写(REWRITE):
- 先写好目标查询(例如带
GROUP BY s_cid, SUM(n_je)的语句),再包装成CREATE MATERIALIZED VIEW mv_test AS ...语句 - 执行
BEGIN DBMS_MVIEW.EXPLAIN_MVIEW('mv_test'); END;,然后查mv_capabilities_table - 重点看
capability_name = 'REFRESH_FAST'和'REWRITE_FULL'的possible是否为'Y',以及msgtxt是否为空或仅含'no problem' - 若
msgtxt含'cannot fast refresh',常见原因是没建物化视图日志、基表无主键、或 SELECT 中漏了COUNT(*)(尤其聚合 MV)
真正能“半自动”的路径:结合 AWR + 自定义脚本
如果你有持续的 SQL 性能问题,可绕过缺失的 Advisor,用底层数据自己推导候选 MV:
- 从
DBA_HIST_SQLSTAT和DBA_HIST_SQLTEXT中提取高执行频次、高 CPU/elapsed time 的 SQL,过滤掉绑定变量过多或文本不稳定的语句 - 用正则匹配识别高频模式:如反复出现的
JOIN ZW_YINGYEZ ... GROUP BY s_cid,就可能是 MV 候选 - 对候选 SQL 手动生成
CREATE MATERIALIZED VIEW语句(注意显式加上ENABLE QUERY REWRITE和PCT,如果基表是 RANGE 分区) - 用上一节的
EXPLAIN_MVIEW批量验证,再人工决策是否创建
这个过程无法全自动,但比盲建更可靠。最容易被忽略的是:即使你建了 MV 并启用了 QUERY REWRITE,Oracle 也不会重写所有等价查询——必须确保优化器模式为 ALL_ROWS,且 QUERY_REWRITE_ENABLED = TRUE,否则 SELECT * FROM base_table 永远不会去查 MV。











