物化视图创建语句

creatematerializedview[view_name]

refresh[fast|complete|force]

[

on[commit|demand]|

startwith(start_time)next(next_time)

with rowid    //不加这一行,如果采用了fast更新的话,默认是使用源表主键对应的物化视图日志,所以必须有主键且物化视图日志必须建立在主键上

for update    //加上了这一行才可以对物化视图进行update和delete,否则报错ORA-01732

]

as

{创建物化视图用的查询语句}  //语句对象可以来自表、同义词、视图,同义词和视图虽然只是定义没有数据,但是select同义词和视图的时候出来的就是数据

案例1

create materialized view test_materializedview

refresh complete  on demand

start with sysdate next sysdate+1/144

with rowid

for update    //加上了这一行才可以对物化视图进行update和delete,否则报错ORA-01732

as

select * from test

案例2

create

materialized view log on po.po_asl_attributes with rowid;

create

materialized view cux.cux_suppliers_mv refresh fast with rowid on demand

as select * from

po.po_asl_attributes;

手工再增加刷新频率

alter

materialized view cux.cux_suppliers_mv refresh fast on demand Start with

sysdate+30/(24*60*60) next sysdate+30/(24*60*60);

alter materialized view cux_system_items_mv refresh fast on demand Start with sysdate next TRUNC(sysdate)+1+4/(24);--每天凌晨4点运行

物化视图创建后,会自动创建一张和物化视图同名的表,会在dba_objects中出现两个对象,OBJECT_TYPE分别是TABLE、MATERIALIZED VIEW。user_mviews、user_tables中都会出现这个对象

USER_MVIEWS.STALENESS是NEEDS_COMPILE时,user_objects.object_type为MATERIALIZED VIEW的user_objects.status是INVALID,而user_objects.object_type为TABLE的user_objects.status是VALID,一般影响不大,物化视图还是可以继续查询出数据了,当然也可以重新编译一下ALTER MATERIALIZED VIEW MV_NAME COMPILE;

物化视图占用空间,空间大小和base table一样大,但是在user_segments.segment_type显示的值是table而不是MATERIALIZED VIEW

MV也可以直接update、delete,但是不影响base table,当然MV执行update、delete后又会根据commit或demand next time自动恢复和base table表一致

refresh[fast|complete|force]

MV刷新的方式:

fast:增量刷新.假设前一次刷新的时间为t1,那么使用fast模式刷新物化视图时,只向视图中添加t1到当前时间段内,主表变化过的数据.为了记录这种变化,建立增量刷新物化视图源表必须建立物化视图日志。creatematerializedviewlogontablename with rowid或creatematerializedviewlogontablenameWITH PRIMARY KEY;多张表时此语句也生效,创建后,原来的表中会多出两类视图表:MLOG$_table_name和RUPD$_table_name

complete:全部刷新。相当于重新执行一次创建视图的查询语句。基于视图建立物化视图,则只能refresh complete。

force:这是默认的数据刷新方式。当可以使用fast模式时,数据刷新将采用fast方式;否则使用complete方式。

MV数据刷新的时间:

ondemand:在用户需要刷新的时候刷新,如果有start

with则系统会自动建立job定时刷新

oncommit:当主表中有数据提交的时候,立即刷新MV中的数据;

startwith:从指定的时间开始,每隔一段时间(由next指定)就刷新一次;会自动建立job定时刷新

物化视图注意事项:

1.创建物化视图必须在自己的schema用户下创建,如果有startwith选项则创建后会在自己schema下创建一个自动刷新物化视图的job,不在自己用户创建物化视图,创建好后无法创建自动刷新视图的job。

比如在system用户下给A用户创建了一个物化视图,但是A用户下并不会出现对应的自动刷新物化视图的job

2.如果是fast刷新,原表不能是视图,且源表必须有materialized

view log,materialized

view log可以建立在主键上或rowid上

创建materialized view log的标准语句如下(为什么一定要加INCLUDINGNEWVALUES没有搞清楚,实验过不加的情况下主表update、delete后物化视图也是会刷新的)

CREATEMATERIALIZEDVIEWLOGONtablenameWITH ROWID;

或CREATEMATERIALIZEDVIEWLOGONtablenameWITH PRIMARY KEY INCLUDING NEW VALUES;

删除materialized view log的语句如下

drop materialized view log ONtablename

A用户fast刷新方式创建物化视图时基表来自不同用户B,则不仅要授予A select B基表权限,也要授予Aselect B基表MATERIALIZEDVIEWLOG权限

3.如果是complete刷新,则源表没有任何要求,complete刷新时原表可以是视图

没有建立job自动刷新物化视图,则物化视图也可以手工(如下CUX_PER_PEOPLE_F_M是物化视图的名称)

begin

DBMS_MVIEW.REFRESH ('CUX_PER_PEOPLE_F_MV');

end;

以下start with后面的时间随便定义,不管定义成sysdate之前还是之后,时间都是执行create

materialized语句的这个时刻

create materialized view test13

refresh force on demand

start with sysdate-1 next sysdate+1/360

as

select * from luxus.test1@xuniji

执行以上语句后马上再select

last_refresh_date from user_mviews发现时间就是刚才执行create

materialized语句的这个时刻

遇到复杂的系统视图,我们可以使用物化视图代替该系统视图的方法来提升性能,例如下面的案例

系统视图dba_network_acl_privileges很复杂,直接select * from dba_network_acl_privileges显示的执行计划就非常复杂调用了大量的系统对象。

selectprincipalfromdba_network_acl_privilegeswhereacl='/sys/acls/mail_acl2.xml'andprincipalnotin(selectprincipalfromdba_network_acl_privilegeswhereacl='/sys/acls/mail_acl2.xml'andprivilege='resolve'andprincipalisnotnull)执行很慢、执行计划很复杂、且没有返回任何结果。

使用同义词dba_acl代替dba_network_acl_privileges来执行上述语句依旧如此

CREATE SYNONYM dba_acl FOR

dba_network_acl_privileges

使用物化视图dba_acl2代替dba_network_acl_privileges来执行上述语句后性能大大提升,执行很快、执行计划简单、且有返回结果,如果加上start with next条件还能定时更新

create materialized view dba_acl2

refresh completeon demand

as select * from dba_network_acl_privileges

当然使用新建一张表代替dba_network_acl_privileges来执行上述语句后性能也能大大提升,执行很快、执行计划简单、且有返回结果,但缺点是表无法实时或定时更新

create table dba_acl3

as select * from dba_network_acl_privileges

oracle needs compile,物化视图相关推荐

  1. Oracle 原理: 物化视图,快照,实体化视图。

    8i和8i前,oracle 提供了 快照 snapshot ,9i中把其改名为物化视图,也叫实体化视图 materialized View. 在海量数据中,如果只想查询特定的数据,通常会select ...

  2. oracle olap创建物化视图,CUUG oracle物化视图讲解

    1.视图是什么? 普通视图:只是存放在数据字典当中的子查询,本身没有来源于基表 Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表.物化 ...

  3. oracle olap创建物化视图,Oracle 物化视图同步表-roid

    一.在目标库建立DBLINK 目标库操作: 主机B中建立TNS(tnsname.ora),也可以使用netca建立TNS [oracle@rac1 ~]$ cd /u01/app/oracle/pro ...

  4. oracle数据库创建物化视图

    为了共享本地数据但是又不想把自己本地数据库其他信息给第三方,可以在其他库创建物化视图共享数据,废话不多说,直接上案例 CREATE MATERIALIZED VIEW JQMSRPT.MV_DEMO_ ...

  5. oracle编译失效物化视图,使用“不存在”的Oracle物化视图

    启用快速刷新很棘手,有许多奇怪的限制和无用的错误消息.在这种情况下,您需要创建物理化视图日志WITH ROWID,使用()连接语法,并为每个表添加ROWID. create table tablea( ...

  6. oracle 物化视图没效果,Oracle物化视图失效的几种情况及测试

    物化视图(Materialized Views)是查询的结果集,所有原表和视图的变更都将导致物化视图的失效,最近就发现了一个物化视图经常失 说明:物化视图(Materialized Views)是查询 ...

  7. oracle雾化试图_Oracle 物化视图 说明

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

  8. oracle 物化视图、中间表的方案

    物化视图 有个项目因为有比较多的查询汇总,考虑到速度,所以使用了物化视图.简单的把用到的给整理了下.先看简单创建语句: create materialized view mv_materialized ...

  9. Oracle物化视图的创建及使用(一

    Oracle物化视图的创建及使用  http://blog.csdn.net/tegwy/article/details/8935058  先看简单创建语句: create   materialize ...

最新文章

  1. 5分钟 NLP 系列: Word2Vec和Doc2Vec
  2. kdump和crash的配置方法与内核故障原因分析(一)
  3. 数据库优化 - MYSQL优化
  4. C#企业级开发案例精解:用经典案例学通 NET技术
  5. android 加网络权限管理,Android添加用户组及自定义App权限的方法
  6. linux 编写java代码
  7. 社区发现(三)--CMP
  8. 第六章 类型和成员基础
  9. 常用传感器讲解四--水位传感器(water sensor)
  10. CMS网站页面管理开发汇总
  11. Leetcode 741. Cherry Pickup DP
  12. 支持扫描的单usb口打印服务器,LP-1000 TT168L1 打印机共享器 USB网络 远程 扫描 云打印服务器...
  13. rac集群状态中监听状态CHECK TIMED OUT处理
  14. mct接收_Android实现文件上传功能(接收端用strust2)
  15. 利用Sobel算子,求梯度图像
  16. 科目一知识点口诀(考驾照顺手整理了一下课)
  17. Linux中SELINUX状态的巨大影响
  18. 【Adams安装打开出现不是内部命令,也不是可运行程序问题】
  19. 利用三层判断sql数据库中编码是否已经存在(个人拙作,不喜勿喷)
  20. 串口控制好步进马达,两轴伺服电机运动控制器步进直流电机控制器

热门文章

  1. Android 9.0实现系统内录(只录制系统声音)
  2. 短视频下半场,随刻怎样跑赢?
  3. linux命令 gedit,使用linux的gedit命令GNOME桌面的文本编辑器
  4. oracle服务器 驱动安装教程,oracle服务器 驱动安装
  5. 易语言Excel工作簿方法
  6. window10系统字体修改
  7. Linux网卡模块,linux查看网卡驱动模块信息
  8. STM32读写24C02遇到的问题
  9. 如何将视频转化为gif
  10. Redis(16) -- Redis集群