1. 程式人生 > 其它 >oracle物化檢視和檢視的資料不一致

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, 還望大佬賜教.