oracle物化视图和视图的数据不一致

问题: oracle物化视图和视图的数据不一致

问题描述

一个考试系统, 创建了一个统计分数的视图: v_score, 根据这个视图创建了一个物化视图:

-- drop materialized view mv_score;
create  materialized view mv_score
refresh complete on demand    
start with sysdate 
next trunc(sysdate,'mi')+1/24 /* 每隔一小时刷新一次  */
as
select * from v_score;

创建物化视图之后立即查询视图和物化视图:
(立即查询避免物化视图没有刷新导致的问题)

select * from v_score ;
select * from mv_score ;

查询出来的两个结果不一致:
视图的结果:

物化视图的结果:

其中count_score_xx字段表示各个分数段的数量, score_xx_avg表示各个分数段的平均值;
count_score_xx字段视图和物化视图的结果一致; score_xx_avg视图的数据正常, 但是物化视图只有score_90_avg数据正常, 其他字段全是null;

oracle版本:

select * from v$version;

Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
"CORE	12.2.0.1.0	Production"
TNS for Linux: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production

尝试解决

搜索的关键词:

oracle materialized view some column is null
oracle materialized view missing data
oracle materialized view losing  data
oracle view materialized data not same
oracle view materialized wrong different

只找到很少的相关内容, 没有找到解决方案;
oracle - Materialized View data different from View with same source - Stack Overflow

Materialized view do not show the data - Page 2 — oracle-tech

猜测可能的原因: create物化视图的时候某些选项不合适, 看看官方文档;
(翻了一圈没结果)
CREATE MATERIALIZED VIEW

分析sql

count正常、avg不正常, avg换个计算方式试试:
原方式:

avg(v.review_score_80_90) score_80_90_avg,

新方式:

sum(v.review_score_80_90)/count(v.review_score_80_90) score_80_90_avg,

改造之后恢复正常, 物化视图和视图的数据一致了;

根本原因

表面上解决了问题, 根本原因没搞清楚, 猜测可能是oracle的bug, 还望大佬赐教.

posted @ 2021-11-11 12:59  QIAOXINGXING001  阅读(321)  评论(0编辑  收藏  举报