Real-time materialized view,面向开发者的12.2新特性

题记:在12.2之前,如果使用on command刷新物化视图,必须得有个job来定时的刷,那么,在一次job运行之后,下一次job到来之前,如果基表有数据变化,那么此时的数据肯定不是最新的。12.2中提出的real time mv即可以帮你获取实时的数据,且不用频繁的刷新mv。

为什么要有real time mv?

在12.2之前,如果你想获得实时的数据,那么在利用query rewrite前,你必须得用on commit的刷新方式刷新物化视图。但是on commit的刷新方式有众多限制,如sql的复杂度,如频繁对系统的压力等等。所以,我们不得不采用on command的方式来进行刷新(不管是全量刷新还是增量刷新)。那么在使用on command刷新的时候,必须得有个job来定时的刷,那么,在一次job运行之后,下一次job到来之前,如果基表有数据变化,那么此时的数据肯定不是最新的。

real time mv就是为了解决这个问题而生的。它即可以帮你获取实时的数据,且不用频繁的刷新mv。我们来看一下这是怎么实现的。

传统mv的创建方式:

Real time mv的创建方式

注意在create mv时的关键字:enable on query computation

我们来比较一下传统mv和real time mv的差别: 相关参数:

初始状态: 传统mv:

Real time mv:

看到此时2个物化视图,数据都是最新的,staleness显示是fresh:

物化视图日志里面也没有记录

我们对基表insert数据:

可以看到2个表的staleness已经变成need compile,且物化视图日志表里面,也与了日志的记录:

我们来见证一下奇迹的时刻。我们先重复上面第一个查询,可以看到,由于数据stale,且没有set query_rewrite_integrity=stale_tolerated,传统mv没有进行query write。

我们看到,real time mv,进行了query rewrite,且查到的数据是最新实时数据!

执行计划如下:

统计信息如下:

我们看到,在查t2的时候,优化器会根据成本决定是否使用query rewrite。 我们的这个例子中CBO选择使用query rewrite。可以看到query rewrite到物化视图之后,不是取的是过期的物化视图的值,而是最新的值。结合执行计划,可以看到,是结合了stale的物化视图,再union all和hash join outer了物化视图日志。得到了最新的结果。

可以看到,使用的物化视图日志是”MAS$”.”SNAPTIME$$”>TO_DATE(‘ 2017-07-12 14:35:01’, ‘syyyy-mm-dd hh24:mi:ss’)之后的。

对比直接从table取值,到利用real time物化视图取值,consistent get从4167变成了1232。注意我们的mv log还是没有被刷新的。还是需要去定期的job刷新:

另外再提一下,有个/*+ fresh_mv */的hint,可以直接查询real time mv的实时结果:

综上,Real time mv利用原来的已经stale的物化视图,结合mv log,通过计算后,帮你获取实时的数据。你即能获得实时数据,又不必那么频繁的刷新mv。

参考: https://blogs.oracle.com/sql/12-things-developers-will-love-about-oracle-database-12c-release-2#real-time-mv https://blog.dbi-services.com/12cr2-real-time-materialized-view-on-query-computation/ https://uhesse.com/2017/01/05/real-time-materialized-views-in-oracle-12c/ https://docs.oracle.com/database/122/SQLRF/CREATE-MATERIALIZED-VIEW.htm#SQLRF01302

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2017-07-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python3

bs4爬虫实战一:获取百度贴吧内容

进入百度贴吧,访问: https://tieba.baidu.com/index.html

1234
来自专栏吴伟祥

Lucene、solr以及elasticsearch之间的区别和联系

Lucene是一套信息检索工具包,并不包含搜索引擎系统,它包含了索引结构、读写索引工具、相关性工具、排序等功能,因此在使用Lucene时仍需要关注搜索引擎系统,...

843
来自专栏魏艾斯博客www.vpsss.net

WordPress 手动优化和插件优化 MySQL 数据库的方法

952
来自专栏葡萄城控件技术团队

ActiveReports 报表中 RDF 文件解析

AcitveReport 提供两种报表模板,XML(RPX)模板和Code-Based 模板。两者都可以用于设计报表。 但是 RDF 格式文件我们大多不是很了...

2019
来自专栏Ceph对象存储方案

RGW奇淫技巧-玩转system特权

开启system特权 root@demohost:/home/user# radosgw-admin user modify --system=1 --uid=...

2005
来自专栏磨磨谈

ceph luminous 新功能之磁盘智能分组

本篇是luminous一个新功能介绍,关于磁盘智能分组的,这个在ceph里面叫crush class,这个我自己起名叫磁盘智能分组,因为这个实现的功能就是根据磁...

672
来自专栏Netkiller

PHP高级编程之消息队列

PHP高级编程之消息队列 摘要 2015-10-19 第一版 2016-11-31 第二版 目录 1. 什么是消息队列 2. 为什么使用消息队列 3. 什么场合...

3354
来自专栏张善友的专栏

微软发布TX(LINQ To Logs And Traces)

微软开源技术公司于发布了Tx,这是一个Apache 2协议的开源项目,可以使用日志/跟踪文件辅助调试,以及创建实时监控和告警系统。 下面是几个引人关注的功能——...

1896
来自专栏自动化测试实战

《selenium2 python 自动化测试实战》(9)——切换窗口

4155
来自专栏张善友的专栏

ASP.NET Identity V2

Microsoft.AspNet.Identity是微软在MVC 5.0中新引入的一种membership框架,和之前ASP.NET传统的membership以...

1828

扫码关注云+社区