物化视图

Posted 时光太浅爱太深

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了物化视图相关的知识,希望对你有一定的参考价值。

永不放弃,一切皆有可能!!!

只为成功找方法,不为失败找借口!

物化视图

1.定义

  1)Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。

  2)物化视图可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。

  3)物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能;物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性;

  4)物化视图需要占用存储空间;当基表发生变化时,物化视图也应当刷新。

    5)物化视图可以查询表,视图和其它的物化视图。

  6)物化视图由于是物理真实存在的,故可以创建索引。

  7)对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。

    物化视图是主体对象在某一时间点上的复制品。这个主体对象即可以是主体站点上的一个主表,也可以是物化视图站点上的一个主物化视图。在多主复制中,一个站点上的表被其他主体站点连续不断的更新,而物化视图则是从一个主体站点或主物化视图站点批量的进行更新。当 物化视图进行快速 刷新时,Oracle会检查主表或主物化视图自上次刷新以来的所有改变,并将其应用到物化视图上。因此,如果主体对象自上次刷新以来存在一些改变,则刷新 操作则会花费一定的时间把这些改变应用到物化视图上。如果自上次刷新以来没有发生任何变化,则物化视图刷新操作会迅速的完成。

 

2. 应用

  Oracle的物化视图主要用在两个方面:高级复制和数据仓库。在高级复制环境中,物化视图用于复制数据到非主体站点。在数据仓库环境中,物化视图用于对代价昂贵的查询进行缓存。

 

3.优势

  (1)减轻网络负载:
  你可以通过物化视图将数据分布到许多站点,所有用户不需要再访问一个数据库服务器,负载被分散到多个数据库服务器上。和多主复制不同的是,你可以根据需要,只复制表中的一部分字段或者表中的一部分数据,从而降低了每次复制的数据量。 多主复制也可以分布网络负载,但与物化视  图相比它对网络的要求要严格得多。由于多主复制各个站点间采用的是网状连接,每个站点和其他所有的站点都有通 信,而且多主复制一般用于提供实时或接近实时的复制,这会导致很高的网络流量,对于网络状况要求比较严格。物化视图采用高效的批量更新方式,从一个主体站 点或一个主  物化视图站点获得更新。和多主复制的连续通信不一样,物化视图复制只需要周期性的刷新,从而对网络的要求大大降低。

  (2)创建Mass Deployment环境:
  展开模板允许你在本地预先建立物化视图环境。你可以利用展开模板快速简便的展开物化视图环境。你可以不用修改展开模板,而是利用参数来建立不同用户的客户化数据集。

  (3)数据子集:
  物化视图允许你的复制建立在列或者行的基础上,而多主复制需要复制整张表。通过使用Data subsetting,对于每个站点你可以仅复制满足本站点需要的数据。

  (4)离线部署:
  物化视图不需要专用网络连接。你可以利用job的调度机制完成物化视图的定时自动刷新,你也可以在需要的时候手工刷新物化视图。而这第二种方法是在笔记本上运行应用程序的一种理想解决方案。

 

4.操作 

  1)创建物化视图语句:   Create materialized view MV_TEST

  2)Build immediate:     创建时生成数据对应的是build deferred

  3)增量刷新:Refresh fast

  4)On commit :在基表有更新时提交,这里该句对视图无效

  5)With rowid:创建基于rowid的物化视图,对应的是 primary key

 

5.例子

  1)创建物化视图

复制代码
CREATE MATERIALIZED VIEW firstView --创建物化视图  
 
BUILD IMMEDIATE  --在视图编写好后创建  
 
REFRESH FAST WITH PRIMARY KEY  --根据主表主键增量刷新(FAST,增量)  
 
ON DEMAND  -- 在用户需要时,由用户刷新  
 
ENABLE QUERY REWRITE  --可读写  
 
AS  
 
SELECT * FROM table1; --查询语句  
复制代码

  2)创建刷新日志(为配合增量刷新,ORACLE要求要在主表上建立物化视图日志)

复制代码
CREATE MATERIALIZED VIEW LOG ON firstView  
 
WITH PRIMARY KEY  
 
INCLUDING NEW VALUES;  
 
复制代码

  3)视图刷新

复制代码
CREATE OR REPLACE PROCDURE P_REFRESH AS  
 
BEGIN  
 
DBMS_MVIEW.REFRESH(\'firstView\',\'f\');  (f、增量刷新,c、完全刷新,?、强制刷新)
 
END P_REFRESH;  
复制代码

  注意:

  1、如果需要同时刷新多个物化视图,必须用逗号把各个物化视图名称连接起来,并对每个视图都要指明刷新方式

  2、当日志和物化视图创建好后,删除日志,则需要重新创建物化视图,否则无法增量刷新。

  3、因为上面写的物化视图时根据主键进行更新,因此,主表必须有主键。

 

  4)物化视图删除(若创建了日志应一起删除)

DROP MATERIALIZED VIEW LOG ON firstView;  
 
DROP MATERIALIZED VIEW firstView;

 

以上是关于物化视图的主要内容,如果未能解决你的问题,请参考以下文章

是否有一个 postgres 命令来列出/删除所有物化视图?

物化视图 - 识别最后一次刷新

获取物化视图状态,未知状态

触发物化视图刷新 - AWS Lambda

ORACLE:物化视图 - 更改从子句开始

Oracle - 创建物化视图