oracle物化檢視和檢視的資料不一致
阿新 • • 發佈:2021-11-11
問題: 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, 還望大佬賜教.