千家信息网

Oracle 物化视图

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,一、物化视图概述Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。物化视图可以用于预先计
千家信息网最后更新 2025年02月01日Oracle 物化视图

一、物化视图概述

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

物化视图可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能;物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性;物化视图需要占用存储空间;当基表发生变化时,物化视图也应当刷新。

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

通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。

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

对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。

在复制环境下,创建的物化视图通常情况下主键,rowid,和子查询视图。

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

1.1 物化视图可以分为以下三种类型

  • 包含聚集的物化视图;

  • 只包含连接的物化视图;

  • 嵌套物化视图。

三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。

创建物化视图时可以指定多种选项,下面对几种主要的选择进行简单说明:

(1)创建方式(Build Methods):包括BUILD IMMEDIATE和BUILD DEFERRED两种。

  • BUILD IMMEDIATE是在创建物化视图的时候就生成数据。默认为BUILD IMMEDIATE。

  • BUILD DEFERRED则在创建时不生成数据,以后根据需要在生成数据。

(2)查询重写(QueryRewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。

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

(3)刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。刷新的模式有两种:ON DEMAND和ON COMMIT。

ON DEMAND和ON COMMIT物化视图的区别在于其刷新方法的不同,ON DEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新,即更新物化视图,以保证和基表数据的一致性;而ON COMMIT是说,一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。对基表,平常的COMMIT在0.01秒内可以完成,但在有了ON COMMIT视图后,居然要6秒。速度减低了很多倍。ON COMMIT视图对基表的影响可见一斑。

1.2 物化视图,根据不同的着重点可以有不同的分类:

1)按刷新方式分:FAST/COMPLETE/FORCE

2)按刷新时间的不同:ON DEMAND/ON COMMIT

3)按是否可更新:UPDATABLE/READ ONLY

4)按是否支持查询重写:ENABLE QUERY REWRITE/DISABLEQUERY REWRITE

默认情况下,如果没指定刷新方法和刷新模式,则Oracle默认为FORCE和DEMAND。

注意:设置REFRESH ON COMMIT的物化视图不能访问远端对象。

在建立物化视图的时候可以指定ORDER BY语句,使生成的数据按照一定的顺序进行保存。不过这个语句不会写入物化视图的定义中,而且对以后的刷新也无效。

1.3 物化视图有三种刷新方式:COMPLETE、FAST和 FORCE。

  • 完全刷新(COMPLETE)会删除表中所有的记录(如果是单表刷新,可能会采用TRUNCATE的方式),然后根据物化视图中查询语句的定义重新生成物化视图。

  • 快速刷新(FAST)采用增量刷新的机制,只将自上次刷新以后对基表进行的所有操作刷新到物化视图中去。FAST必须创建基于主表的视图日志。对于增量刷新选项,如果在子查询中存在分析函数,则物化视图不起作用。

  • 采用FORCE方式,Oracle会自动判断是否满足快速刷新的条件,如果满足则进行快速刷新,否则进行完全刷新。

Oracle物化视图的快速刷新机制是通过物化视图日志完成的。Oracle通过一个物化视图日志还可以支持多个物化视图的快速刷新。

物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。

1.4 物化视图Refresh子句的其他说明与示例

REFRESH 子句可以包含如下部分:

[refresh [fast|complete|force]

[on demand | commit]

[start with date] [next date]

[with {primary key|rowid}]]

1.4.1 主键和ROWD子句:

WITH PRIMARY KEY选项生成主键物化视图,也就是说物化视图是基于主表的主键,而不是ROWID(对应于ROWID子句). PRIMARY KEY是默认选项,为了生成PRIMARY KEY子句,应该在主表上定义主键,否则应该用基于ROWID的物化视图.

基于ROWID物化视图只有一个单一的主表,不能包括下面任何一项:

(1)Distinct 或者聚合函数.

(2)Group by,子查询,连接和SET操作

1.4.2 刷新时间:

START WITH子句通知数据库完成从主表到本地表第一次复制的时间,应该及时估计下一次运行的时间点, NEXT 子句说明了刷新的间隔时间.

1.5 ON PREBUILD TABLE 说明

在创建物化视图时指明ON PREBUILD TABLE语句,可以将物化视图建立在一个已经存在的表上。这种情况下,物化视图和表必须同名。当删除物化视图时,不会删除同名的表。

这种物化视图的查询重写要求参数QUERY_REWRITE_INTEGERITY必须设置为trusted或者stale_tolerated。

1.6 物化视图分区

物化视图可以进行分区。而且基于分区的物化视图可以支持分区变化跟踪(PCT)。具有这种特性的物化视图,当基表进行了分区维护操作后,仍然可以进行快速刷新操作。对于聚集物化视图,可以在GROUP BY列表中使用CUBE或ROLLUP,来建立不同等级的聚集物化视图。

二、物化视图使用示例

2.1 创建物化视图

create materialized view mv_emp_pk refresh fast         --快速刷新build immediate      --立即刷新on demand            --按照指定方式刷新start with sysdate   --第一次刷新时间,sysdate表示当前时间,也可以使用to_date()指定时间next sysdate+1       --刷新时间间隔with primary key     --创建主键物化视图,也可以使用with rowidas                   --子查询select employee_id from employees where department_id=10;

可以看到报错ORA-23413

23413, 00000, "table \"%s\".\"%s\" does not have a materialized view log"

// *Cause: The fast refresh can not be performed because the master table

// does not contain a materialized view log.

// *Action: Use the CREATE MATERIALIZED VIEW LOG command to create a

// materialized view log on the master table.

从错误描述上可以知道,要创建的物化视图的刷新方式为FAST,但是表employees上没有创建物化视图日志,所以报上面的错误。

在表employees上创建物化视图日志后再创建物化视图。

zx@ORA11G>create materialized view log on employees;Materialized view log created.zx@ORA11G>create materialized view mv_emp_pk   2  build immediate   3  refresh fast                4  on demand              5  start with sysdate     6  next sysdate+1         7  with primary key       8  as                    9  select employee_id  10  from employees  11  where department_id=10;Materialized view created.zx@ORA11G>select * from mv_emp_pk;EMPLOYEE_ID-----------        200        zx@ORA11G>select employee_id from employees where department_id=10;EMPLOYEE_ID-----------        200

2.2 查看job中物化视图刷新的时间

zx@ORA11G>select job,what,last_date,next_date from dba_jobs where log_user='ZX';       JOB WHAT                                          LAST_DATE      NEXT_DATE---------- -------------------------------------------------- ----------------- -----------------         3 dbms_refresh.refresh('"ZX"."MV_EMP_PK"');        20170809 12:02:41 20170810 12:02:41

2.3 修改employees表中的数据

zx@ORA11G>insert into employees (EMPLOYEE_ID,LAST_NAME,EMAIL,HIRE_DATE,JOB_ID,DEPARTMENT_ID) values(209,'zx','zx@163.com',sysdate,10,10);1 row created.zx@ORA11G>commit;Commit complete.zx@ORA11G>select * from mv_emp_pk;EMPLOYEE_ID-----------        200

新插入的数据没有刷新到物化视图中

2.4 刷新物化视图

(1)使用dbms_mview.refresh 手工刷新

zx@ORA11G>exec dbms_mview.refresh('MV_EMP_PK');PL/SQL procedure successfully completed.zx@ORA11G>select * from mv_emp_pk;EMPLOYEE_ID-----------        200        209zx@ORA11G>exec dbms_mview.refresh('MV_EMP_PK','c');--全量刷新PL/SQL procedure successfully completed.zx@ORA11G>exec dbms_mview.refresh('MV_EMP_PK','f');--快速刷新PL/SQL procedure successfully completed.

(2)使用dbms_refresh.refresh 过程来批量刷新MV

如果我们在创建物化视图的过程指定start 和next time的刷新时间,那么Oracle 会自动创建刷新的job,并采用dbms_refresh.refresh 的方式。如2.2所示

如果没有指定next time使用这种方式刷新之前需要先make refresh group,然后才可以刷新。

假设存在物化视图MV_T1, MV_T2, MV_T3. 创建refresh group的语法如下:

SQL> EXEC DBMS_REFRESH.MAKE('REP_TEST', 'MV_T1,MV_T2,MV_T3', SYSDATE, 'SYSDATE+ 1');--刷新整个refresh group 组:  SQL> EXEC DBMS_REFRESH.REFRESH('REP_TEST') ;

2.5 查询物化视图状态

--user_mviews视图zx@ORA11G>select owner,mview_name,refresh_mode,LAST_REFRESH_TYPE,LAST_REFRESH_DATE,REFRESH_MODE from user_mviews;OWNER                          MVIEW_NAME                  REFRES LAST_REF LAST_REFRESH_DATE REFRES------------------------------ ------------------------------ ------ -------- ----------------- ------ZX                             MV_EMP_PK                   DEMAND FAST     20170809 12:26:40 DEMAND--user_mview_refresh_times视图zx@ORA11G>col owner for a10zx@ORA11G>col name for a10zx@ORA11G>col master_owner for a10zx@ORA11G>col master for a10zx@ORA11G>select * from user_mview_refresh_times;OWNER      NAME       MASTER_OWN MASTER     LAST_REFRESH---------- ---------- ---------- ---------- -----------------ZX         MV_EMP_PK  ZX        EMPLOYEES  20170809 12:26:40

2.6 删除物化视图和日志

zx@ORA11G>drop materialized view mv_emp_pk;Materialized view dropped.zx@ORA11G>drop materialized view log on employees;Materialized view log dropped.

如果删除物化视图日志后,再以fash方式刷新物化视图会报如下错误

zx@ORA11G>exec dbms_mview.refresh('MV_EMP_PK','f');BEGIN dbms_mview.refresh('MV_EMP_PK','f'); END;*ERROR at line 1:ORA-23413: table "ZX"."EMPLOYEES" does not have a materialized view logORA-06512: at "SYS.DBMS_SNAPSHOT", line 2809ORA-06512: at "SYS.DBMS_SNAPSHOT", line 3025ORA-06512: at "SYS.DBMS_SNAPSHOT", line 2994ORA-06512: at line 1

2.7 创建远程物化视图

--在远端创建一个物化视图zx@ORA12C>create materialized view mv_emp_pk   2  build immediate   3  refresh fast                4  on demand              5  start with sysdate     6  next sysdate+1         7  with primary key       8  as                    9  select employee_id  10  from employees@link_ora11g  11  where department_id=10;Materialized view created.zx@ORA12C>select * from mv_emp_pk;EMPLOYEE_ID-----------        200        209--在源端删除employees表中的数据zx@ORA11G>delete from employees where employee_id=209;1 row deleted.zx@ORA11G>commit;Commit complete.        zx@ORA12C>select * from mv_emp_pk;EMPLOYEE_ID-----------        200        209--刷新物化视图zx@ORA12C>exec dbms_mview.refresh('MV_EMP_PK');PL/SQL procedure successfully completed.zx@ORA12C>select * from mv_emp_pk;EMPLOYEE_ID-----------        200

2.8 创建基于commit的物化视图

zx@ORA11G>create materialized view mv_emp_commit  2  refresh fast   3  on commit  4  with primary key  5  as   6  select employee_id   7  from employees   8  where department_id=10;Materialized view created.zx@ORA11G>select * from mv_emp_commit;EMPLOYEE_ID-----------        200--插入新数据并提交zx@ORA11G>insert into employees (EMPLOYEE_ID,LAST_NAME,EMAIL,HIRE_DATE,JOB_ID,DEPARTMENT_ID) values(209,'zx','zx@163.com',sysdate,10,10);1 row created.zx@ORA11G>commit;Commit complete.--commit后物化视图自动刷新zx@ORA11G>select * from mv_emp_commit;EMPLOYEE_ID-----------        200        209zx@ORA11G>delete from employees where employee_id=209;1 row deleted.zx@ORA11G>select * from mv_emp_commit;EMPLOYEE_ID-----------        200        209zx@ORA11G>commit;Commit complete.zx@ORA11G>select * from mv_emp_commit;EMPLOYEE_ID-----------        200

参考:http://blog.csdn.net/tianlesoftware/article/details/4713553

http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_6002.htm#SQLRF01302

http://docs.oracle.com/cd/E11882_01/server.112/e40540/schemaob.htm#CNCPT411


视图 数据 查询 方式 时间 日志 子句 生成 不同 情况 语句 副本 结果 支持 方法 时候 错误 更新 一致 仓库 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 校园软件开发规划书简介 兼职软件开发师招聘词怎么写 招聘app软件开发工程师 数据库什么语句用来删除数据 db2数据库表查询有多少列 吉林省科技厅高企认定互联网 深圳配资盘软件开发 计算机本科网络安全方向 我国网络安全保护法基本法 宁波上海互联网科技有限公司 电力网络安全事件应急演练 学习数据库系统原理有什么用 录像机日志里提示数据库重建 网络安全证书补贴杭州 窗体与oracle数据库应用 数据库data 类型怎么输入 数据库信息个人总结800字 轻量化数据库json 数据库原理及应用考试要点 浙江app软件开发的企业 四年级上册网络安全周手抄报 网络安全靠人民倡议书范文 页面部署到服务器 下面一行乱码 城阳区苹果软件开发系统 软件开发资质甲级 c软件开发需要学多久 pg数据库服务是否正常 上城区物流软件开发 数据库基本函数依赖FD 网络技术控是什么意思
0