物化视图详解(原创)

标签: 物化 视图 原创 | 发表时间:2013-03-10 23:30 | 作者:
出处:http://www.iteye.com

物化视图

物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。物化视图可以基于表查询,视图和其它的物化视图。通常情况下,在复制环境下,物化视图被称为主表,在数据仓库中称为明细表。
对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。
对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。

物化视图日志
如果你想要采用快速刷新的话,必须建立基于主表的物化视图日志。物化视图可以记录主表被更新记录的主键、ROWID或对象标识或者二者全部。物化视图日志也可以包含其他列用以支持带子查询的物化视图的快速刷新。
物化视图日志表的名称为MLOG$_后面跟主体对象的名称。物化视图日志和主体对象建立在相同的用户模式下。一个物化视图日志可以支持多个基于主体对象的物化视图。
有下列几种物化视图日志:
主键:物化视图日志在记录主体对象发生变化的记录时,是根据主键定位的。
ROWID:物化视图日志在记录主体对象发生变化的记录时,是根据ROWID定位的。
对象标识:物化视图日志在记录主体对象发生变化的记录时,是根据对象标识定位的。
组合类型:物化视图日志在记录主体对象发生变化的记录时,是根据上面三种类型的组合来定位的。如果物化视图日志根据主键、ROWID和对象标识定位变化的数据,则这种物化视图日志同时支持主键、ROWID和对象物化视图,这种物化视图日志对于一个包含三种类型物化视图的环境是很有用的。组合类型物化视图日志和其他类型物化视图日志工作方式相同,只不过多记录了一、二种类型。
虽然主键物化视图日志和ROWID物化视图日志的差别很小,但是这些差别在实际使用中有着很大的影响。ROWID物化视图日志会在进行重组和截断时十分困难。例如,如果你对主表进行了重组和截断,那么ROWID物化视图必须执行完全刷新,这是因为ROWID发生了变化。

物化视图实践
Oracle提供以下几种不同类型的物化视图,以满足各种复制环境的需要:主键物化视图和ROWID物化视图。
主键物化视图
主键物化视图是默认的物化视图。在复制环境下,如果主键物化视图是作为物化视图组的一部分建立的,如果指定了FOR UPDATE语句,那么这个物化视图是可更新的,且这个物化视图组必须和主站点中复制组的同入股名。另外,可更新物化视图必须和主复制组在不同的数据库中。当修改发生后,修改的数据以行级为单位被传播,每行数据由主键确定。
主键物化视图可以包含一个子查询,因此你可以在建立物化视图时,建立所有数据的一个子集,也就是说,建立物化视图时可以只选取你需要的数据行。如果主站点中的主对象建立了物化视图日志表,那么一些包含特定类型子查询的主键物化视图仍然可以快速(增量)刷新。

SQL> create materialized view log on emp;
Materialized view log created.
SQL> create materialized view mv_emp_pk
  2  refresh fast
  3  start with sysdate
  4  next sysdate + 1/48
  5  with primary key
  6  as
  7  select * from emp;
Materialized view created.
SQL> create materialized view mv_emp_pk
  2  build deferred
  3  refresh fast
  4  start with sysdate
  5  next sysdate + 1/48
  6  with primary key
  7  as
  8  select * from emp;
Materialized view created.
SQL> select * from mv_emp_pk;
no rows selected

子查询物化视图
SQL>create materialized view m_test_view
as
select * from gwm_tabattribute a where exists (select * from gwm_attribute b where a.gwm_ano=b.gwm_ano);
生成数据有两大选项:
Build immediate:在创建物化视图的同时根据主表生成数据,默认选项
Bulid deferred:在创建物化视图的同时,在物化视图内不生成数据,如果此时没有生成数据,以后可以采取:EXEC DBMS_MVIEW.Refresh(‘MV_name’,’C’),注意必须使用全量刷新,默认是增量刷新,所以这里参数必须是C,因为之前都没有生成数据,所以必须全量。
刷新方式有:complete fast force
Complete:完全刷新整个物化视图,相当于重新生成物化视图,此时即时增量刷新可用也全量刷新
Fast:当有数据更新时依照相应的规则对物化视图进行更新,该选项必须在创建有物化视图日志的情况下才能使用。

Force:当增量刷新可用则增量刷新,当增量刷新不可用,则全量刷新(此项为默认选项)
不过从实际情况出发,应该尽量不使用默认选项,可以考虑使用增量刷新,对大表特别有效,大表全量更新速度是非常慢的,特别是在存在索引的情况下。(在创建物化视图语句中,可能某些限制查询的条件,导致了增量刷新无法使用,这个是需要注意的,具体是哪类语句导致fast刷新不可用,有待总结…..)
刷新时间:on demand on commit start with/ next
On demand:在需要刷新时进行刷新(人工判断)
On commit:在基表上有提交操作时,进行更新
Start with:指定首次刷新的时间(一般指定的是当前时间,不过也可以在创建物化视图时不生成数据,则可以考虑在指定的时间刷新,从而生成数据)
Next:刷新的周期时间

查询重写(Query Rewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。分别指出创建的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图 来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为DISABLE QUERY REWRITE。

SQL> Create materialized view MV_TEST
Refresh fast
Enable query rewrite
As
Select * from TEST;
ROWID物化视图
为了后向兼容性,Oracle除了默认的主键物化视图外,还支持ROWID物化视图。ROWID物化视图基于主表对象中行记录的物理标识ROWID。在复制环境,ROWID物化视图只被用在基于Oracle7版本的主对象的物化视图,它不能被用于建立基于Oracle8或更高版本主站点的物化视图。
SQL>  create materialized view mv_emp_rowid
  2    build immediate
  3    refresh force
  4    on commit
  5    with rowid
  6    as
  7*   select * from emp
Materialized view created.

删除日志:
DROP materialized view log on emp;
删除物化视图
drop materialized view mv_emp_pk
基本和对表的操作一致 --物化视图由于是物理真实存在的,故可以创建索引。

物化视图的优缺点

优点:
1,物化视图的最大的优势是可以提高性能:Oracle的物化视图提供了强大的功能,可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。
2, 物化视图有很多方面和索引很相似
3,通过预先计算好答案存储起来,可以大大地减少机器的负载
A,更少的物理读--扫描更少的数据
B,更少的写--不用经常排序和聚集
C。减少CPU的消耗--不用对数据进行聚集计算和函数调用
D,显著地加快响应时间--在使用物化视图查询数据时(与主表相反),将会很快的返回查询结果
缺点:
1,物化视图用于只读或者“精读”环境下工作最好 ,不用于联机事务处理系统(OLTP)环境,在事实表等更新时会导致物化视图行锁,从而影响系统并发性。
2,物化视图有出现无法快速刷新,导致查询数据不准确的现象
3,Rowid物化视图(创建的物化视图通常情况下有主键,rowid,和子查询视图)只有一个单一的主表,不能包括下面任何一项:
A,Distinct 或者聚合函数.
B,Group by,子查询,连接和SET操作
4,物化视图会增加对磁盘资源的需求,即需要永久分配的硬盘空间给物化视图来存储数据
5,物化视图的工作原理受一些可能的约束,比如主键,外键等。

 

参考至:http://hi.baidu.com/csu_syh329/item/314953ddcb9dc11dd78ed03d

               http://blog.csdn.net/suncrafted/article/details/4300358

               http://www.blogjava.net/wxqxs/archive/2008/09/03/226694.html

               http://blog.sina.com.cn/s/blog_5b2470430100ek3o.html

               http://www.cnblogs.com/lanzi/archive/2010/11/16/1878344.html

               http://www.2cto.com/database/201203/124905.html

本文原创,转载请注明出处、作者

如有错误,欢迎指正
邮箱:[email protected]



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [物化 视图 原创] 推荐:

物化视图详解(原创)

- - ITeye博客
物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表. 物化视图存储基于远程表的数据,也可以称为快照. 物化视图可以基于表查询,视图和其它的物化视图. 通常情况下,在复制环境下,物化视图被称为主表,在数据仓库中称为明细表. 对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的.

ClickHouse 物化视图在微信的实战经验

- - IT瘾-dev
ClickHouse广泛用于用户和系统日志查询场景中,借助腾讯云提供基础设施,微信也在分阶段逐步推进clickhouse的建设和应用,目前作为基础建设的一部分,主要针对于OLAP场景,为业务方提供稳定高效的查询服务. 在业务场景下,实时事件流上报可能会在不同的日志,以不同的格式、途径写入到clickhouse.

ETL概述(原创)

- - ITeye博客
ETL,Extraction- Transformation-Loading的缩写,即数据抽取(Extract)、转换(Transform)、装载(Load)的过程,它是构建数 据仓库的重要环节. ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程,目的是将企业中的分散、零乱、标准不统一的数据整合到一起,为 企业的决策提供分析依据.

PL/SQL动态SQL(原创)

- - ITeye博客
使用动态SQL是在编写PL/SQL过程时经常使用的方法之一. 很多情况下,比如根据业务的需要,如果输入不同查询条件,则生成不同的执行SQL查询语句,对于这种情况需要使用动态SQL来完成. 再比如,对于分页的情况,对于不同的表,必定存在不同的字段,因此使用静态SQL则只能针对某几个特定的表来形成分页.

将原创进行到底

- - 杨晖的博客-TV2.0的实验田
——来源《投资者报》 记者 占昕.     “六年前的某一天,杨晖来到我当时工作的外滩中心楼下的咖啡厅,她对我讲她要办一个叫《波士堂》的电视节目. 俺当时心里咕嘟着,‘她也太想当boss了吧’. ”这是唯众六周年晚宴,睿狮广告传播的首席战略官沈柏屏在留言卡片上写下的一段话. 或许你尚来不及知道她的名字,但你一定知道《波士堂》、《谁来一起午餐》、《开讲啦》、《这会儿不上班》等风靡全国的电视节目.

[原创] 国人原创咆哮体《哔哔儿你伤不起》

- Tony - 黑莓时光
这是来自新浪微博上的国人哔哔儿 廖小肥 的原创咆哮体内容,非常犀利也非常有爱,快快分享阅读. 《哔哔儿你伤不起》| 原创咆哮体 by @廖小肥. 谁跟老子讲黑莓是世界上最屌的手机啊. 尼玛谁说黑莓在911事件中一战成名啊. 那是因为老外的黑莓都开通BIS和BES啊. 国内玩黑莓的淫才TM百分之几啊.

移动端的拟物化设计

- Han - 所有文章 - UCD大社区
人在处理信息,学习和记忆的能力是有限的. 现实生活中人们又会经常受到各种客观因素的影响,所以有效的降低用户的操作和学习负担能够使产品更易于被广大用户所接受. 随着互联网产品设计越来越重视用户体验的今天,除了产品本身的功能的创新之外,产品与用户之间的交互体验成为各个公司追求的目标. 好的设计不但在视觉上带给用户更多美的享受,同时还可以从视觉层面帮助和引导用户完成所需的操作.

Linux Deepin 开始招募原创团队

- Acumon - Wow! Ubuntu
为了支持 Linux Deepin 的长期发展,我们已经成立武汉深之度科技有限公司,为 Linux Deepin 发行版和社区提供有力的后续支持. 武汉深之度科技将与 linux deepin 社区共同致力于与研发最优秀的桌面Linux系统,推进Linux在中国乃至全球的桌面应用. 目前,我们已经有了多名同事,分别从事开发,维护,设计,文档,测试等工作,还需要更多有理想也有趣的伙伴,欢迎你的加入.

语不惊人死不休(55):原创

- helen - 左岸读书_blog
先思考个问题:你最擅长的三个技能是什么呢. 你就是一道风景 ,没必要在别人风景里面仰视. 每个人出生的时候都是独一无二的“原创”,可是很多人渐渐变成了“盗版”. 每个人都身怀天赋,但如果用会不会爬树的能力来评判一只鱼,它会终其一生以为自己愚蠢. 每个人都会有幸运之神眷顾,但是很多人总是不经意地忘记善待它.

YouTube将重金投资原创内容

- 雪冬 - Solidot
本月初,《华尔街日报》报道引用消息来源透露,世界最大的视频分享网站YouTube将在原创内容上投资1亿美元. 最新的报导称投资数额已经上升到了1.5亿美元,正式上线时间可能是在明年初,YouTube届时将推出24个原创内容频道. 围绕这项计划有许多推测和传言,例如有人认为此举是为了推动Google TV,因为Google TV没有得到大型有线电视网的内容支持,所以它决定自己生产内容.