Oracle 12c创建物化视图触发ORA-00600与ORA-03113错误咨询
这是Oracle 12c的已知Bug,对应官方Bug编号22166315。
触发条件正是创建物化视图时,子查询内包含ORDER BY子句加rownum限制的逻辑,当ORDER BY后调用DBMS_RANDOM这类函数时,会进一步提高触发概率。错误本质是Oracle后台进程在处理物化视图的查询重写逻辑时出现内存访问异常,抛出内部错误ORA-00600后强制断开会话连接,因此你会收到ORA-03113通信通道中断的报错。
可通过以下几种方案规避:
- 改写SQL逻辑,先把
UNION结果存入临时表再创建物化视图:
-- 创建临时表存储UNION结果 CREATE GLOBAL TEMPORARY TABLE tmp_union_res AS SELECT * FROM table1 UNION SELECT * FROM table2; -- 基于临时表创建物化视图 CREATE MATERIALIZED VIEW orders_mv AS SELECT * FROM ( SELECT * FROM tmp_union_res ORDER BY DBMS_RANDOM.VALUE ) WHERE rownum <= 5;
- 用12c原生支持的
FETCH FIRST语法替代rownum过滤,可直接规避该Bug:
CREATE MATERIALIZED VIEW orders_mv AS SELECT * FROM table1 UNION SELECT * FROM table2 ORDER BY DBMS_RANDOM.VALUE FETCH FIRST 5 ROWS ONLY;
- 长期使用可申请对应官方补丁,补丁适配12.1.0.2及以上所有12c版本,安装后可彻底修复该问题。
内容的提问来源于stack exchange,提问作者Landon Statis
相关产品推荐
相关产品推荐

