问题: 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, 还望大佬赐教.