You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 19c物化视图返回错误结果,请求排查原因

Oracle 19c(19.15)物化视图Fast Refresh数据异常问题

问题现象

在Oracle 19c(19.15版本)中创建基于两表关联聚合的Fast Refresh物化视图后,执行删除旧数据再插入同主键新数据的操作,物化视图中的聚合值(sum、count)出现累计错误,但直接查询基表能得到正确结果。

可复现测试脚本

create table b(
    tsn varchar2(16) not null primary key,
    fid varchar2(256) not null
);

create table bs(
    tsn varchar2(16) not null constraint bet_stakes_fk references b,
    leg number(1) not null,
    amount number(10) not null,
    primary key (tsn, leg) using index compress 1
);

create materialized view log on b
    with primary key, rowid, sequence, commit scn (fid)
    including new values;

create materialized view log on bs
    with primary key, rowid, sequence, commit scn (amount)
    including new values;

create materialized view bsd_mv
refresh fast start with (sysdate - 1) next (sysdate + 1/14400)
as
select fid, leg, sum(amount), count(*)
from bs inner join b using (tsn)
group by fid, leg;

insert into b values ('a', 'o');
insert into bs values ('a', 1, 10);
commit;

delete from bs where tsn = 'a';
delete from b where tsn = 'a';
insert into b values ('a', 'o');
insert into bs values ('a', 1, 5);
commit;

操作与结果

执行上述脚本后等待约10秒,执行查询:

select * from bsd_mv;

实际异常结果(执行次数不同可能略有差异)

FidLegSumCount
o1153

预期正确结果

FidLegSumCount
o151

问题分析

  1. 配置验证:物化视图日志已正确包含Fast Refresh所需的主键、rowid、sequence、commit scn信息,且指定了聚合所需的列,物化视图定义符合Oracle对两表关联聚合Fast Refresh的要求,不存在配置错误。
  2. 数据一致性验证:直接执行物化视图对应的基表查询(select fid, leg, sum(amount), count(*) from bs inner join b using (tsn) group by fid, leg;)始终能得到正确结果,说明基表数据无异常。
  3. 根因判断:该问题大概率是Oracle 19c 19.15版本的Bug——当删除父表(b)的主键记录、再删除子表(bs)对应记录,随后重新插入相同主键的父表和子表记录时,Fast Refresh的增量更新逻辑未正确抵消旧数据的聚合值,导致新旧数据的聚合结果错误累加。

验证方法

手动执行完全刷新命令后,物化视图数据会恢复正确:

refresh materialized view bsd_mv;

内容的提问来源于stack exchange,提问作者Per Huss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:35:30