欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Oracle 物化视图

程序员文章站 2024-01-12 17:00:16
...

近来看到一些文章有关Oracle 物化视图的,整合了下,比较详细,以作memo: 物化视图(Materialized View)在9i以前的版本叫做快照(SNAPSHOT),从9i开始改名叫做物化视图。其实无论是快照还是物化视图,都能体现出这个对象的特点。 物化视图中的数据来自于基

近来看到一些文章有关Oracle 物化视图的,整合了下,比较详细,以作memo:



物化视图(Materialized View)在9i以前的版本叫做快照(SNAPSHOT),从9i开始改名叫做物化视图。其实无论是快照还是物化视图,都能体现出这个对象的特点。
物化视图中的数据来自于基表某个时刻(物化视图的创建时刻,或刷新时刻),因此可以认为是基表都个时刻的快照。
物化视图和视图类似,反应的是某个查询的结果,但是和视图仅保存SQL定义不同,物化视图本身会存储数据,因此是物化了的视图。

根据使用功能来分,物化视图可以分为用于数据复制的,或用于预计算查询重新的两个方面。
物化视图本身有具有很多特性,根据创建方式、刷新方式、是否可更新、是否支持查询重新等可以将物化视图进行进一步的细分。

用于数据复制的物化视图

物化视图的一个主要功能就是用于数据的复制,Oracle推出的高级复制功能分为两个部分,多主复制和物化视图复制。
而物化视图复制就是利用了物化视图的功能。

物化视图复制包含只读物化视图复制、可更新物化视图复制和可写物化视图复制。
只读物化视图复制建立的是源数据库的只读环境。可更新物化视图复制建立基于物化视图双向复制环境。
可写物化视图复制在物化视图建立的时候使用了FOR UPDATE,但是没有像可更新物化视图那样添加到物化视图组中,因此本地物化视图可以修改,但是修改无法发送到源数据库中,因为修改在物化视图刷新后会丢失,这种类型的物化视图复制很少使用。

只读物化视图环境复制创建的例子:
http://www.itpub.net/thread-204968-1-1.html
http://www.itpub.net/viewthread.php?tid=234279


物化视图复制环境的维护

物化视图复制环境包括主站点和物化视图站点。根据物化视图是否需要更新,决定是否建立复制组和物化视图组。
对于只读物化视图而言,不需要建立复制组和物化视图组,因此主站点除了建立物化视图日志外,几乎不需要进行任何的改变。
而对于可更新的物化视图,则物化视图必须添加到物化视图组中,因此主站点比较建立复制组。如果主站点本身不是多主复制中的成员,那么可以在主站点上建立一个单主复制环境。
对于包含复制组的主站点而言,复制组中的表的DDL操作会和普通表的DDL有所不同,直接对表进行DDL可能会破坏复制对象。

物化视图复制环境中一些维护相关问题

物化视图导出导入可能导致物化视图日志的失效:一个很恐怖的bug,会在意想不到的情况下造成物化视图复制环境被破坏。
物化视图注册信息的清除:物化视图清除注册信息的问题。
物化视图复制快速刷新的限制(一):不能在复制得到的物化视图上建立快速刷新的物化视图。
物化视图复制快速刷新的限制(二):变向的解决方案,将连接或聚集物化视图提前放到基表站点。
包含复制环境的数据库迁移(一):物化视图站点通过EXP/IMP进行迁移。
包含复制环境的数据库迁移(二):单主站点通过EXP/IMP进行迁移。
如何确定导致刷新组刷新失败的物化视图(一):讨论对于本地物化视图,如何定位刷新组中刷新失败的物化视图。
如何确定导致刷新组刷新失败的物化视图(二):这篇文章描述一种对于各种情况均适用的方法。
物化视图日志没有清除:介绍了手工清除非正常删除的物化视图的注册信息。
物化视图刷新过程中出现的约束冲突问题:物化视图刷新过程中约束冲突的解决方法。
ORA-26500错误:建立、删除函数索引等操作执行后应该重新对表生成复制支持。


用于预计算的物化视图

这种类型的物化视图一般用于数据仓库系统。主要用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。这种物化视图还经常使用查询重写(query rewrite)机制,这样不需要修改原有的查询语句,Oracle会自动选择合适的物化视图进行查询,完全对应用透明。

这种物化视图可以分为以下三种类型:包含聚集的物化视图;只包含连接的物化视图;嵌套物化视图。三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。

创建物化视图时可以指定多种选项:
创建方式(Build Methods):包括BUILD IMMEDIATE和BUILD DEFERRED两种。BUILD IMMEDIATE是在创建物化视图的时候就生成数据,而BUILD DEFERRED则在创建时不生成数据,以后根据需要在生成数据。默认为BUILD IMMEDIATE。
查询重写(Query Rewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。分别指出创建的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为DISABLE QUERY REWRITE。
刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。刷新的模式有两种:ON DEMAND和ON COMMIT。ON DEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。ON COMMIT指出物化视图在对基表的DML操作提交的同时进行刷新。刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。默认值是FORCE ON DEMAND。

可以指明ON PREBUILD TABLE语句将物化视图建立在一个已经存在的表上。这种情况下,物化视图和表必须同名。当删除物化视图时,不会删除同名的表。这种物化视图的查询重写要求参数QUERY_REWRITE_INTEGERITY必须设置为trusted或者stale_tolerated。

物化视图可以进行分区。而且基于分区的物化视图可以支持分区变化跟踪(PCT)。具有这种特性的物化视图,当基表进行了分区维护操作后,仍然可以进行快速刷新操作。


基于预计算物化视图特点的简单描述:
http://yangtingkun.itpub.net/post/468/11356



物化视图的特点

物化视图创建:
建立包含ROLLUP或CUBE的物化视图:何时使用包含ROLLUP和CUBE的物化视图。
建立物化视图所需权限(一):建立普通物化视图所需权限。
建立物化视图所需权限(二):建立快速刷新物化视图所需权限。
建立物化视图所需权限(三):建立ON COMMIT物化视图所需权限。
建立物化视图所需权限(四):建立查询重写物化视图所需权限。
在包含LONG类型的表上建立物化视图:物化视图可以复制LONG类型。
物化视图的创建写法与刷新问题:物化视图的创建写法与刷新问题。
物化视图删除的顺序:讨论的删除物化视图和删除物化视图日志的顺序。
创建其他用户下的物化视图报错权限不足:创建一个其他用户的物化视图时报错。




物化视图快速刷新:
定位导致物化视图无法快速刷新的原因:当无法创建快速刷新的物化视图时,如何找到物化视图不能快速刷新的原因。
物化视图的快速刷新(一):基于连接的物化视图的快速刷新限制。
物化视图的快速刷新(二):基于聚集的物化视图的快速刷新限制。
物化视图的快速刷新(三):包含UNION ALL的物化视图的快速刷新限制。
两个导致物化视图无法快速刷新的问题:同义词问题和不同表字段追加问题。
物化视图的非原子性刷新:介绍物化视图的原子性刷新特点。

物化视图查询重新:
建立支持查询重写的同名物化视图失败会删除原有物化视图:这个bug可能导致你原有物化视图被意外删除。
物化视图查询重写的限制(一):建立查询重写的物化视图的限制。
物化视图查询重写的限制(二):使用查询重写功能的限制条件。

物化视图PCT特性:
物化视图的PCT特性(一):基于分区表的物化视图的PCT特性介绍。
物化视图的PCT特性(二):基于分区表的物化视图的PCT特性的限制条件。
10G物化视图PCT快速刷新不再需要物化视图日志(一):Oracle10g增加了物化视图PCT快速刷新的支持,使用PCT快速刷新不再需要物化视图日志。
10G物化视图PCT快速刷新不再需要物化视图日志(二):继续深入研究一下PCT快速刷新的机制。
10G物化视图PCT快速刷新不再需要物化视图日志(三):研究PCT快速刷新的机制。



物化视图深入研究

对于物化视图的内部机制的研究:

物化视图日志结构:详细介绍Oracle物化视图日志的各个字段的含义。
Oracle如何根据物化视图日志快速刷新物化视图:描述Oracle是如何利用物化视图日志来刷新物化视图的。
物化视图日志如何避免系统时间变化带来的影响:介绍Oracle的物化视图日志机制是如何避免调整系统时间带来的影响的。
物化视图是否根据字段进行刷新(一):描述现象。
物化视图是否根据字段进行刷新(二):对Oracle的刷新行为进行推测。
物化视图是否根据字段进行刷新(三):通过SQL_TRACE的方式确认前面文章的推测。
小议物化视图与基表数据不一致的消除(一):快速刷新的只读物化视图于基表不一致的解决方法。
小议物化视图与基表数据不一致的消除(二):修改物化视图日志来同步INSERT和DELETE操作。
小议物化视图与基表数据不一致的消除(三):如何通过修改物化视图日志来同步UPDATE操作。
小议物化视图与基表数据不一致的消除(四):如何通过修改物化视图日志来同步包含LOB列的UPDATE操作。
一个物化视图快速刷新的问题:不影响快速刷新的限制物化视图的字段精度方法。
物化视图日志的维护:降低物化视图日志表的高水位线。
利用触发器对物化视图刷新进行定制:可以通过在物化视图上创建触发器的方式,对刷新操作进行定制。
物化视图刷新并非完全根据物化视图日志记录:物化视图的刷新不仅仅依赖于物化视图日志。
数的物化视图。
包含LOB的物化视图快速刷新:9.2和10上对于包含LOB的物化视图的快速刷新,处理机制不同。
包含LOB的物化视图快速刷新(二):继续研究10g以后对LOB对象是如何刷新的。
包含LOB的物化视图快速刷新(三):研究10g以后版本当LOB对象超过32K时,物化视图如何刷新。
包含LOB的物化视图快速刷新(四):对比9i和11g包含LOB的物化视图的刷新性能。
物化视图日志表被DROP后建立物化视图报错:如果物化视图日志表是直接被DROP,则建立物化视图时报错。
获取物化视图字段的修改矢量(一):描述如何获取一个列修改后对应的物化视图修改矢量。
获取物化视图字段的修改矢量(二):介绍多个字段被修改的情况。
获取物化视图字段的修改矢量(三):封装了一个函数来完成这个功能。


物化视图功能灵活运用

物化视图功能很强大,灵活运用物化视图,可以使得现有的功能锦上添花,也可以实现更多的功能


物化视图方式进行逻辑数据迁移:数据库逻辑迁移方式除了EXP/IMP之外,还可以使用物化视图进行迁移。
利用物化视图进行逻辑数据迁移要点:简单介绍一下使用物化视图进行逻辑数据迁移过程中需要注意的一些要点。

一个物化视图快速刷新的问题:不影响快速刷新的限制物化视图的字段精度方法。
利用触发器对物化视图刷新进行定制:可以通过在物化视图上创建触发器的方式,对刷新操作进行定制。
改造DISTINCT物化视图(一):介绍SELECT语句中的DISTINCT操作。
改造DISTINCT物化视图(二):介绍COUNT或SUM聚集函数中的DISTINCT操作。
改造DISTINCT物化视图(三):描述一个包含UNION ALL的例子。
改造包含MAX或MIN的物化视图:如何改造一个包含MAX或MIN聚集函数的物化视图。




Oracle的在线重定义功能其实本质就是利用物化视图日志来实现的,重定义过程的数据同步也是利用物化视图的快速刷新。
不过由于在线重定义也需要物化视图日志的支持,因此在11g以前,是没有办法对已经建立物化视图日志的表进行在线重定义的,不过11g中Oracle增加了这个功能:
Oracle11新特性——在线操作功能增强(六):在线重定义功能对物化视图日志的支持。


物化视图有关的问题和BUG

一些物化视图关于的问题和BUG描述:

oracle的执行计划居然出错!:9204中查询重写的bug。
建立支持查询重写的同名物化视图失败会删除原有物化视图:这个bug可能导致你原有物化视图被意外删除。

物化视图导出导入可能导致物化视图日志的失效:一个很恐怖的bug,会在意想不到的情况下造成物化视图复制环境被破坏。
两个导致物化视图无法快速刷新的问题:同义词问题和不同表字段追加问题。
物化视图注册信息的清除:物化视图清除注册信息的问题。
ORA-600(999)错误(一):物化视图刷新的问题。
ORA-600(999)错误(二):进一步深入研究这个问题。
ORA-600(999)错误(三):进一步深入研究数据库中缺少了哪些信息造成了这个问题。
物化视图刷新过程中出现的约束冲突问题:物化视图刷新过程中约束冲突的解决方法。
建立物化视图导致数据库实例崩溃:建立物化视图的时候,直接导致了实例的崩溃。
小议物化视图与基表数据不一致的消除(一):快速刷新的只读物化视图于基表不一致的解决方法。
小议物化视图与基表数据不一致的消除(二):修改物化视图日志来同步INSERT和DELETE操作。
小议物化视图与基表数据不一致的消除(三):如何通过修改物化视图日志来同步UPDATE操作。
小议物化视图与基表数据不一致的消除(四):如何通过修改物化视图日志来同步包含LOB列的UPDATE操作。
10203设置CURSOR_SHARING为SIMILAR导致物化视图刷新失败:设置CURSOR_SHARING为SIMILAR导致物化视图刷新失败。
一个物化视图快速刷新的问题:不影响快速刷新的限制物化视图的字段精度方法。
ORA-600(ksmovrflow)错误:8i或9i数据库以10g的基表建立物化视图的时候报错。
如何确定导致刷新组刷新失败的物化视图(一):讨论对于本地物化视图,如何定位刷新组中刷新失败的物化视图。
如何确定导致刷新组刷新失败的物化视图(二):这篇文章描述一种对于各种情况均适用的方法。
物化视图基表站点升级导致物化视图刷新错误ORA-4062:物化视图快速刷新报错,出现ORA-4062、ORA-4068错误。
ORA-600(kkzgavupd_agg.2)错误:在9204上快速刷新一个物化视图出现这个错误。
物化视图删除的顺序:讨论的删除物化视图和删除物化视图日志的顺序。
物化视图日志的维护:降低物化视图日志表的高水位线。
创建其他用户下的物化视图报错权限不足:创建一个其他用户的物化视图时报错。
ORA-6544(55916)错误:在11g上建立物化视图访问10.1的源表报错。
ORA-12028错误:在建立物化视图中碰到了这个错误。
ORA-23515错误:包含物化视图的表空间无法直接删除。
ORA-26500错误:建立、删除函数索引等操作执行后应该重新对表生成复制支持。