一、物化的一般使用方法物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,不论什么对视图的查询,oracle都实际上转换为视图SQL语句的查询。这样对总体查询性能的提高。并没有实质上的优点。

1、物化视图的类型ON DEMAND、ON COMMIT。

二者的差别在于刷新方法的不同,ON DEMAND顾名思义。仅在该物化视图“须要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;而ON COMMIT是说,一旦基表有了COMMIT,即事务提交。则立马刷新,立马更新物化视图,使得数据和基表一致。

物化视图能够分为下面三种类型:包含聚集的物化视图。仅仅包含连接的物化视图;嵌套物化视图。三种物化视图的高速刷新的限制条件有非常大差别,而对于其它方面则差别不大。创建物化视图时能够指定多种选项,下面对几种基本的选择进行简单说明:

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

BUILD IMMEDIATE是在创建物化视图的时候就生成数据,而BUILD DEFERRED则在创建时不生成数据。以后依据须要在生成数据。默觉得BUILD IMMEDIATE。

查询重写(Query Rewrite):包含ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。分别指出创建的物化视图是否支持查询重写。

查询重写是指当对物化视图的基表进行查询时,Oracle会自己主动推断能否通过查询物化视图来得到结果,假设能够,则避免了聚集或连接操作。而直接从已经计算好的物化视图中读取数据。

默觉得DISABLE QUERY REWRITE。

在建立物化视图的时候能够指定ORDER BY语句,使生成的数据依照一定的顺序进行保存。

只是这个语句不会写入物化视图的定义中。并且对以后的刷新也无效。

2、ON DEMAND物化视图物化视图的创建本身是非常复杂和须要优化參数设置的,特别是针对大型生产数据库系统而言。但Oracle同意以这样的最简单的,类似于普通视图的方式来做。所以不可避免的会涉及到默认值问题。也就是说Oracle给物化视图的重要定义參数的默认值处理是我们须要特别注意的。物化视图的特点:

(1) 物化视图在某种意义上说就是一个物理表(并且不仅仅是一个物理表),这通过其能够被user_tables查询出来,而得到佐证。

(2) 物化视图也是一种段(segment)。所以其有自己的物理存储属性;

(3) 物化视图会占用数据库磁盘空间,这点从user_segment的查询结果。能够得到佐证。

创建语句:

SQL> create materialized view mv_name as select * from table_name;

默认情况下,假设没指定刷新方法和刷新模式,则Oracle默觉得FORCE和DEMAND。

物化视图的数据怎么随着基表而更新?

Oracle提供了两种方式,手工刷新和自己主动刷新,默觉得手工刷新。也就是说,通过我们手工的运行某个Oracle提供的系统级存储过程或包。来保证物化视图与基表数据一致性。这是最基本的刷新办法了。

自己主动刷新,事实上也就是Oracle会建立一个job,通过这个job来调用同样的存储过程或包。加以实现。

ON DEMAND物化视图的特性及其和ON COMMIT物化视图的差别,即前者不刷新(手工或自己主动)就不更新物化视图,而后者不刷新也会更新物化视图,——仅仅要基表发生了COMMIT。

创建定时刷新的物化视图(指定物化视图每天刷新一次):

SQL> create materialized view mv_name refresh force on demand start with sysdate next sysdate+1;

上述创建的物化视图每天刷新,可是没有指定刷新时间,假设要指定刷新时间(比方每天晚上10:00定时刷新一次):

SQL> create materialized view mv_name refresh force on demand start with sysdate next to_date( concat( to_char( sysdate+1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss');

3、ON COMMIT物化视图ON COMMIT物化视图的创建,和上面创建ON DEMAND的物化视图差别不大。

因为ON DEMAND是默认的。所以ON COMMIT物化视图。须要再添加个參数就可以。

须要注意的是,无法在定义时仅指定ON COMMIT。还得附带个參数才行。创建ON COMMIT物化视图:

SQL> create materialized view mv_name refresh force on commit as select * from table_name;

备注:实际创建过程中,基表须要有主键约束,否则会报错(ORA-12014)。

4、物化视图的刷新刷新(Refresh):指当基表发生了DML操作后,物化视图何时採用哪种方式和基表进行同步。

刷新的模式有两种:ON DEMAND和ON COMMIT。

刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。

FAST刷新採用增量刷新,仅仅刷新自上次刷新以后进行的改动。

COMPLETE刷新对整个物化视图进行全然的刷新。假设选择FORCE方式,则Oracle在刷新时会去推断能否够进行高速刷新。假设能够则採用FAST方式,否则採用COMPLETE的方式。

NEVER指物化视图不进行不论什么刷新。

对于已经创建好的物化视图。能够改动其刷新方式,比方把物化视图mv_name的刷新方式改动为每天晚上10点刷新一次:

SQL> alter materialized view mv_name refresh force on demand start with sysdate next to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss');

5、物化视图日志假设须要进行高速刷新。则须要建立物化视图日志。物化视图日志依据不同物化视图的高速刷新的须要,能够建立为ROWID或PRIMARY KEY类型的。还能够选择是否包含SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。

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

6、物化视图分区并且基于分区的物化视图能够支持分区变化跟踪(PCT)。

具有这样的特性的物化视图,当基表进行了分区维护操作后。仍然能够进行高速刷新操作。对于聚集物化视图,能够在GROUP BY列表中使用CUBE或ROLLUP,来建立不同等级的聚集物化视图。

二、物化视图与数据迁移Oracle 的物化视图提供了强大的功能。能够用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在运行查询时。就能够避免进行这些耗时的操作。而从高速的得到结果。

物化视图有非常多方面和索引非常类似:使用物化视图的目的是为了提高查询性能;物化视图相应用透明。添加和删除物化视图不会影响应用程序中SQL 语句的正确性和有效性。物化视图须要占用存储空间;当基表发生变化时,物化视图也应当刷新。

如怎样建立在特定的表空间上,这些在其它的物化视图上面差点儿都没有不论什么介绍的。主要以我做的一个样例来操作,假设对物化视图的基本概念清楚了就比較明确在那里写特定的表空间存储了。

1、简单试验在master site上创建表和mview log

SQL> create table stu (id varchar2(10) primary key ,name varchar2(20));

Table created.

SQL> create materialized view log on stu;

Materialized view log created.

在mv site上创建mview

SQL> create materialized view stu_mv refresh fast start with sysdate next sysdate+1/1440 with primary key as select * from stu@to_vm9;

Materialized view created.

SQL> select job,log_user,last_date,last_sec,next_date,next_sec,interval,what from user_jobs;

JOB LOG_USER LAST_DATE   LAST_SEC  NEXT_DATE   NEXT_SEC   INTERVAL       WHAT

--- --------- ----------- --------- ----------- ---------- -------------- -----------------------------------------

21 SEAGULL   2008-2-18 1 14:41:43  2008-2-18 1 14:42:43   sysdate+1/1440 dbms_refresh.refresh('"SEAGULL"."STU_MV"');

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

STU_MV                         TABLE

在master site上对master table做更新:

SQL> INSERT INTO STU(ID,NAME) VALUES('56','555555555555');

1 row created.

SQL> commit;

等1分钟后在mv site上检查

SQL> select * from stu_mv;

ID         NAME

---------- --------------------

56         555555555555

2、跨版本号数据迁移利用prebuilt mv实现跨平台,跨版本号数据迁移。该方法的实现原理是对于要迁移的表对象,须要有一个主键,用于mv的刷新,对于符合该要求的表,在源表上创建mv日志,再在目标数据库上创建结构一样的表。然后在目标表上採用prebuilt方式创建mv。第一次採用全然刷新,之后採用增量刷新,等真正要切换的时候。仅仅须要刷新完增量的日志。删除mv,保留目标表就可以。基本思路的样例:

在源库上创建表和mview log

SQL> create table big_t1 as select * from dba_objects;

Table created.

SQL> select count(1) from big_t1;

COUNT(1)

----------

6170

SQL> create materialized view log on big_t1;

Materialized view log created.

在目标数据库上创建与该表一样的表。并在该表上创建prebuilt mv:

SQL> create table big_t1 as select * from big_t1@to_vm9 where 1=2;

Table created.

SQL> select count(1) from big_t1;

COUNT(1)

----------

0

SQL> create materialized view big_t1 on prebuilt table refresh fast as select * from big_t1@to_vm9;

Materialized view created.

做全然刷新和增量刷新

SQL> exec dbms_mview.refresh('BIG_T1','Complete');

PL/SQL procedure successfully completed.

SQL> select count(1) from big_t1;

COUNT(1)

----------

6170

此时模拟在做全然刷新过程中,源库的表又发生了变化

SQL> insert into big_t1(object_id,owner) values(99991,'test');

1 row created.

SQL> commit;

Commit complete.

再做增量刷新

SQL> select count(1) from big_t1;

COUNT(1)

----------

6170

SQL> exec dbms_mview.refresh('BIG_T1');

PL/SQL procedure successfully completed.

SQL> select count(1) from big_t1;

COUNT(1)

----------

6171

停机切换,做最后一次刷新。然后删除源库的mview log和目标库的mview:

SQL> exec dbms_mview.refresh('BIG_T1');

PL/SQL procedure successfully completed.

SQL> drop materialized view big_t1;

Materialized view dropped.

SQL> select count(1) from big_t1;

COUNT(1)

----------

6171

这里删除的mview(big_t1)是prebuilt mv,所以删除该mview,并不删除相应的表。假设删除了mvnew(stu_mv),因为是普通mv,则删除了该mview,就没有相应的表了。

SQL> drop materialized view stu_mv;

Materialized view dropped.

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

BIG_T1                         TABLE

3、创建存储的日志空间 SQL> CREATE MATERIALIZED VIEW LOG ON mv_lvy_levytaxbgtdiv

tablespace ZGMV_DATA    --日志保存在特定的表空间

WITH ROWID ;

SQL> CREATE MATERIALIZED VIEW LOG ON tb_lvy_levydetaildata

tablespace ZGMV_DATA     --日志保存在特定的表空间

WITH ROWID,sequence(LEVYDETAILDATAID);

SQL> CREATE MATERIALIZED VIEW LOG ON tb_lvy_levydata

tablespace ZGMV_DATA     --日志保存在特定的表空间

WITH rowid,sequence(LEVYDATAID);

4、然后创建物化视图SQL> create materialized view MV_LVY_LEVYDETAILDATA

TABLESPACE ZGMV_DATA      --保存表空间

BUILD DEFERRED              --延迟刷新不马上刷新

refresh force                     --假设能够高速刷新则进行高速刷新,否则全然刷新

on demand                      --依照指定方式刷新

start with to_date('24-11-2005 18:00:10', 'dd-mm-yyyy hh24:mi:ss') --第一次刷新时间

next TRUNC(SYSDATE+1)+18/24   --刷新时间间隔

as

SELECT levydetaildataid, detaildatano, taxtermbegin, taxtermend,

......

ROUND(taxdeduct * taxpercent1, 2) - ROUND(taxdeduct * taxpercent2, 2) -

ROUND(taxdeduct * taxpercent3, 2) - ROUND(taxdeduct * taxpercent4, 2) -

ROUND(taxdeduct * taxpercent5, 2) taxdeduct, ROUND(taxfinal * taxpercent1, 2) -

ROUND(taxfinal * taxpercent2, 2) - ROUND(taxfinal * taxpercent3, 2) -

ROUND(taxfinal * taxpercent4, 2) - ROUND(taxfinal * taxpercent5, 2) taxfinal,

a.levydataid, a.budgetitemcode, taxtypecode,

......

FROM tb_lvy_levydetaildata a, tb_lvy_levydata c, MV_LVY_LEVYTAXBGTDIV b

WHERE a.levydataid = c.levydataid

AND a.budgetdistrscalecode = b.budgetdistrscalecode

AND a.budgetitemcode = b.budgetitemcode

AND c.incomeresidecode = b.rcvfisccode

AND C.TAXSTATUSCODE='08'

AND C.NEGATIVEFLAG!='9'

5、删除物化视图日志物化视图日志经常会因为物化视图长时间没有刷新,或者基表的一次批量数据更改而变得非常大。这会影响物化视图的刷新性能,因此对于这样的情况须要对物化视图日志进行处理。减少物化视图日志表的高水位线。

物化视图日志会记录下基表全部的增、删、改操作,而物化视图运行完高速刷新操作后,会从物化视图日志中将本物化视图刷新过且其它物化视图所不须要刷新的记录删除掉。

假设当中一个物化视图一直不刷新,那么物化视图日志就会变得越来越大。

另一种情况。比方表中插入了大量的数据,或者删除了大量的数据,或者将表中的某一列统一更新为一个值,这样的操作都会在物化视图日志中产生大量的记录。

而物化视图日志的增大必定影响物化视图的刷新速度。一方面。物化视图在刷新的时候要扫描物化视图日志,另一方面。物化视图在刷新介绍后,也要清除物化视图日志中的记录,仍然要扫描物化视图日志。因此物化视图日志的大小直接会影响物化视图高速刷新的速度。更重要的是,物化视图日志的高水位一旦增长到一个非常高的位置,即使以后物化视图日志中记录非常少,甚至没有记录存在,物化视图在刷新的时候仍然须要较长的时间。

SQL> DROP materialized view log on mv_lvy_levytaxbgtdiv;

SQL> DROP materialized view log on tb_lvy_levydetaildata;

SQL> DROP materialized view log on tb_lvy_levydata;

6、删除物化视图SQL> drop materialized view MV_LVY_LEVYDETAILDATA;

基本和对表的操作一致,物化视图因为是物理真实存在的。故能够创建索引。创建方式和对普通表创建方式同样。

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

物化视图能够查询表,视图和其它的物化视图。

主要用在数据仓库和决策支持系统。

通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。对于复制,物化视图同意你在本地维护远程数据的副本,这些副本是仅仅读的。假设你想改动本地副本,必须用高级复制的功能。

当你想从一个表或视图中抽取数据时。你能够用从物化视图中抽取。

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

物化视图把他的物理结构存储在自己的段中。该段能够被索引和分区。

查询不必全然匹配用来创建物化视图的SQL语句,优化程序能够动态重写一个与原定义相近的查询,以便物化视图用来取代实际的表,这样的查询重写自己主动发生,对用户是透明的。

1、使用物化视图前的几个配置步骤(1) 确定那些语句要创建物化视图。

(2) 决定是否要保持视图与基础表数据同步。

假设不同步,可选择例如以下三种刷新方式:

COMPLETE:刷新启动时。先truncate物化视图。再从基础表又一次插入填充数据。

FAST:仅仅刷新基础表上次刷新后改变的数据。

使用视图的日志数据或ROWID完毕。

FORCE:默认的方式。

先使用FAST,不行就使用COMPLETE方式。

(3) 设置init.ora的參数:

JOB_QUEUE_PROCESSES。必须设置大于 1。

QUERY_REWRITE_ENABLED。设置为TRUE时,同意动态重写查询。

QUERY_REWRITE_INTEGRITY,确定訪问物化视图时数据一致性要遵守的程度。

OPTIMIZER_MODE,必须设置成CBO的某种方式。

使用一个物化视图,用户仅仅需在基础表上拥有权限就可以。

2、创建物化视图SQL>create materialized view emp_by_district

Tablespace mview_data

Build immediate

Refresh fast

Enable query rewrite

As

Select d.id,count(e.last_name) from distributor dist,district d,employee e

Where e.id = dist.manager_id

And d.id dist.district_id

Group by d.id;

下面是Oracle创建物化视图时的经常使用语法,各參数的含义例如以下:

1、refresh [fast|complete|force] 视图刷新的方式

fast: 增量刷新.假设前一次刷新的时间为t1,那么使用fast模式刷新物化视图时,仅仅向视图中加入t1到当前时间段内,主表变化过的数据.为了记录这样的变化,建立增量刷新物化视图还须要一个物化视图日志表。create materialized view log on (主表名)。

complete:全部刷新。相当于又一次运行一次创建视图的查询语句。

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

2、MV数据刷新的时间

on demand:在用户须要刷新的时候刷新,这里就要求用户自己动手去刷新数据了(也能够使用job定时刷新)

on commit:当主表中有数据提交的时候。马上刷新MV中的数据。

start ……:从指定的时间開始,每隔一段时间(由next指定)就刷新一次;

3、Build immediate一共同拥有三个选项

(1) Build immediate:建立物化视图,并使用当前命令运行的数据马上填充视图数据。

(2) Build deferred:仅仅建立物化视图,在第一次刷新之间不填充数据。

(3) No prebuilt table。使用事先已存在的,已含有视图定义中有现有数据的表,而不是建立一个新结构来保存数据。

假设是refresh fast on commit或refresh complete on commit创建的,则在基础表提交的时候都会得到刷新。启用或禁用物化视图。须要有query rewrite或global query rewrite权限。

3、刷新物化视图自己主动刷新:

(1) 使用commit选项。

(2) 使用dbms_mview安排自己主动刷新时间。

手工刷新:

SQL>execute dbms_mview.refresh(‘EMP_BY_DISTRICT’);  --刷新指定的物化视图

SQL>execute dbms_mview.refresh_defresh_dependent(‘EMPLOYEE’);  ――刷新利用了该表的全部物化视图

SQL>execute dbms_mview.refresh_all_mviews;   ――刷新该模式中,自上次刷新以来。未得到刷新的全部物化视图。

4、禁用物化视图- 改动init.ora參数的query_rewrite_enabled參数设置成flase。重新启动实例。

- 使用alter system set query_rewrite_enabled = flase;动态改动。

- 使用alter session set query_rewrite_enabled = flash;改动会话内。

- 使用 norewrite提示。

5、删除物化视图SQL>drop materialized view emp_by_district;

oracle雾化试图_ORACLE物化视图具体解释相关推荐

  1. oracle雾化试图_Oracle物化视图语法

    物化视图概述: Oracle的物化视图提供了强大的功能,可以用在不同的环境中.在不同的环境中,物化视图的作用也不相同.数据仓库中的物化视图主要用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样 ...

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

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

  3. oracle雾化试图_Oracle创建物化视图

    Oracle创建物化视图 通过Oracle物化视图章节,我们已经了解到Oracle物化视图的作用和创建原理,本节通过实例详细讲解Oracle是如何创建物化视图的. 创建物化视图语法: 语法:creat ...

  4. Oracle 如何根据物化视图日志快速刷新物化视图 (不积跬步,无以至千里)

    Oracle物化视图的快速刷新机制是通过物化视图日志完成的.Oracle如何通过一个物化视图日志就可以支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理. 首先,看一下物化视图的结构: SQL ...

  5. Oracle 11g 通过创建物化视图实现不同数据库间的表数据同步

    Oracle 11g 物化视图语法如下: create materialized view [view_name] refresh [fast|complete|force] [ on [commit ...

  6. 傅老师课堂:Oracle高级应用之物化视图(materialized view)

    原文地址:http://hi.baidu.com/gukeming888/blog/item/2682f69481c8237154fb9662.html 物化视图 (Materialized View ...

  7. oracle including new values,物化视图日志加不加INCLUDING NEW VALUES有什么影响

    满意答案 ap.jil 2016.06.30 采纳率:58%    等级:9 已帮助:213人 NEW VALUES Clause The NEW VALUES clause lets you det ...

  8. oracle视图查询机制,物化视图及日志内部机制的一点研究

    Oracle物化视图的快速刷新机制是通过物化视图日志完成的.Oracle如何通过一个物化视图日志就可以支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理. 首先,看一下物化视图的结构: SQL ...

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

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

最新文章

  1. 那个全网下班最早的程序员,我发现了他的秘密……
  2. 3.STM32中对EXTI_PE5_Config()函数的理解(自定义)之中断控制按键LED
  3. iOS开发~sizeClass和autolayout
  4. linux 编译安装picocom,Linux pico命令
  5. 游戏服务器维护启动需要多久,游戏服务器开机需要多长时间
  6. c语言基础编程题讲解,C语言入门例题讲解
  7. conda 环境迁移
  8. 机器学习常见的优化算法
  9. C++派生类与继承(超详细)
  10. 数据库表结构文档生成工具-screw (螺丝钉)
  11. 【Java编程系列】JWT秘钥生成
  12. ubuntu meld打不开
  13. 【毕设记录】第一篇:开题,整体App计划
  14. Android 系统剪贴板的使用 - 复制、获取和清空
  15. hdmi接口有什么用_VGA、DVI、HDMI、DP、TYPE-C接口都有什么区别?
  16. round在python是什么意思_python3.3.2我对函数“round”有正确的理解吗?
  17. atan函数和atan2函数的区别
  18. 【批处理DOS-CMD命令-汇总和小结】-跳转、循环、条件命令(goto、errorlevel、if、for[读取、切分、提取字符串]、)cmd命令错误汇总,cmd错误
  19. 使用Oracle透明网关(Gataway)操作SQL Server
  20. linux,unix,mac osx

热门文章

  1. java反射机制是什么_java的反射机制是什么?
  2. 怎么实时查看mysql当前连接数呢
  3. MATLAB算法实战应用案例精讲-【智能优化算法】强度帕累托进化算法 2 (SPEA2)(附MATLAB代码实现)
  4. lnmp一键部署脚本
  5. python散点图图例显示标记点类型_python – matplotlib散点图中的标记点
  6. 小米note刷android8.1,小米note安卓8.1.0刷机包
  7. 小波变换比傅里叶变换好在哪里_小波变换与傅里叶变换详解——代码下载——非平稳信号与平稳信号的滤波效果对比
  8. APK打包、安装流程
  9. select下拉框选择触发事件
  10. flask 智能图灵机器人