浙江省委宣传部副部长、省委网信办主任赵磊:守正创新 辩证施策 全力推动网络生态治理工作迈上新台阶
2026-02-10
美创产品全面入围中直机关2025年网络设备框架协议采购项目
2026-02-04
连续5年!美创再获中国网络安全产业联盟“先进会员单位”表彰
2026-01-21
每周安全速递³⁷¹ | 勒索软件攻击导致心理健康机构超11万人数据泄露
2026-01-06
四年同行,韧性共铸:西南某商行携手美创科技再度通过年度容灾大考
2025-12-26
存储域
数据库加密 诺亚防勒索访问域
数据库防水坝 数据库防火墙 数据库安全审计 动态脱敏流动域
静态脱敏 数据水印 API审计 API防控 医疗防统方运维服务
数据库运维服务 中间件运维服务 国产信创改造服务 驻场运维服务 供数服务安全咨询服务
数据出境安全治理服务 数据安全能力评估认证服务 数据安全风险评估服务 数据安全治理咨询服务 数据分类分级咨询服务 个人信息风险评估服务 数据安全检查服务在某个午休时间,小编刚刚带上耳机准备好好休整一番,突然传来了微信语音的铃声。
Emmmmm,好吧。
摘下耳机,带上眼镜,接通电话。

客户:我有张表,里面明明有数据,但是我在收集今年11月份的报表数据的时候,sum(num)求和出来为null,其他月份都能正常执行。
小编我:对于李先生这样的情况呢,我们也感到很抱歉,建议李先生如此如此这般这般呢。
客户:???
哈哈哈开个玩笑,作为一个乙方运维肯定要及时尽力地为甲方爸爸排除万难了,小编马上仔细询问了具体的情况,不多时,客户发来了这么一张图片:

根据客户描述,他在对马赛克表做查询时,在monthid为201910时,对num列求和是能够正常求和的;
而在monthid为201911时,对num列求和返回值为null;
而当使用to_number去强制转换该列类型时,求和能返回数值。
另外附上该表的字段信息:
可以确定的是num列的确是个NUMBER类型字段。
听起来的确是个诡异的问题,小编我当时就去查了下在monthid分别为201910、201911时的数据行数,更诡异的事情发生了:

Monthid为201911时,返回的行数居然为0行!

小编我赶紧查了下数据:

可以看到当Monthid为201911时,表中实实在在是存在数据的!
那到底oracle到底是如何瞒天过海,“隐藏”了这些数据呢?
现在让我们直接翻到文章最后一页来看一下正确答案,大家放心,答案不会为略 。
处理过程
小编查看了这条语句的执行计划:

发现他走了一个操作叫做MAT_VIEW REWRITE ACCESS FULL。
顾名思义,就是走了物化视图查询重写来获取数据。
查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。
小编马上对该视图以monthid=’201911’作为条件来查询:

另外,小编获取了该物化视图的ddl语句,发现该物化视图自动刷新方式用的是ON COMMIT。当主表中有数据提交的时候,立即刷新物化视图中的数据。

该自动刷新方式有以下三个特点:
⑴ 仅用于快速刷新的物化视图。
⑵ 需要on commit refresh对象权限。
⑶ 如果刷新失败需要进行手工刷新。
小编查询到该用户是存在on commit refresh对象权限的,客户也是及时提交了,随即小编在数据库日志里发现了以下片段:

说明该物化视图之前曾经刷新失败了,小编进而发现

的确存在该表上的实体化视图日志比上次刷新后的内容新的情况,按照官方文档的建议,小编在知会过客户后,对该物化视图做了完全刷新:
刷新完后,再次查询该语句:

已可以正常查询。
我们再次查询物化视图刷新时间:


知识点总结
1. 物化视图可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。
2. 查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据,从而减少读写。
3. 物化视图的更新有on demand、on commit 两种方式。on demand顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新;而on commit是说,一旦基表有了commit,即事务提交,则立刻刷新。on commit的方式对业务存在一定的影响,建议使用默认的方式,及on demand方式,再设置job任务,定时去刷新物化视图。
参考文献
Master Note for Materialized View (MVIEW) (Doc ID 1353040.1)