物化视图,属于Oracle Advanced Replication(高级复制)的一部分。它能用于复制数据,并提高查询操作的性能。它是数据库对象的一种。

物化视图被创建的时候,会自动的生成一张与物化视图同名的数据库表,该表被称为MV基础表。MV基础表用于存储物化视图存储的SQL(MV SQL)查询出来的结果。

在创建物化视图的时候,对于数据,可以选择立即生成数据;或者,延迟生成数据。延迟生成数据,可以在物化视图创建完成后,于刷新阶段拿到数据。

物化视图有两种刷新方式:
完全刷新。
快速刷新。

基于不同的刷新方式,需要的物化视图的组件也是不同的。
在完全刷新中,物化视图不需要额外的支持,它会将MV中的内容彻底删除,然后使用MV SQL新刷新的结果。
而快速刷新因为仅仅对最近一次刷新进行DML修改,所以它需要依据MV日志来跟踪MV基础表DML更改的情况而判断快速刷新的时候需要具体作何操作。

——————————————————
准备数据:
A:

上面的代码准备了一张用于存放销售数据的表“sales”,通过下列的SQL可以查看日常销售情况的报表:

B:

一、物化视图诞生前:

对日常销售情况的结果集的查询可能会被多次执行,而每次执行将会消耗大量的数据库资源。
所以,为了降低查询该结果集的成本,可以单独创建一个表(实表)来存储这些记录。(业务上,自然人逻辑的规则)

这样,只需要定期更新(刷新)转储表“sales_daily”的数据,即可降低每次执行select的成本(资源消耗):

上面的“delete from sales_daily”也可以用“truncate table xxx”替代。

而上面的这个过程清晰的描述了在Oracle的物化视图中,“刷新”功能在做的事情。
比起上面的人为操作,物化视图可以是数据刷新自动化,并更高幅度的增强其功能。

二、物化视图诞生后:

创建物化视图的权限要求
与物化视图相关的权限是系统权限,而不是对象权限,所以,需要获得权限方面的信息,需要查询:dba_sys_privs

由于,创建物化视图的时候会自动的创建一个物化视图基础表,所以要成功的创建物化视图,你需要有以下权限:
1. CREATE MATERIALIZED VIEW
2. CREATE TABLE

由于物化视图是基于对主表(MV SQL中的FROM部分的表)的查询操作,所以,如果创建MV的用户不是主表的拥有者,那么需要对其具有‘SELECT’权限(对象权限,需要查询:dba_tab_priv。

在我的当前环境里,我操作的用户是:SCOTT。

创建完全刷新的MV。

你可以在系统对象视图中查看到:

对象“I_SNAP$_EMP_DEPT_STATUS_MV”为MV的唯一索引,创建目的是为了提高刷新的性能。

刷新数据:
Before:

插入数据:

再次查询:

但是,物化视图还没有相应的变化:

开始刷新:
快速刷新是会失败的:
Tips:exec dbms_mview.refresh(‘xxxxx’,’F’),其中,第二个参数的F(Fast),表示快速刷新。

因为该物化视图没有MV Log。

只有完全刷新才能成功:
Tips:exec dbms_mview.refresh(‘xxxxx’,’C’),其中,第二个参数的C(Complete),表示完全刷新。

刷新完成后,再次查看物化视图的状态:

以上,展示了最基本的物化视图的使用。
—————————————————————
Done。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

隐藏
变装