Oracle物化视图
oracle物化视图及创建索引
oracle物化视图及创建索引物化视图是⼀种特殊的物理表,“物化”(Materialized)视图是相对普通视图⽽⾔的。
普通视图是虚拟表,应⽤的局限性⼤,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。
这样对整体查询性能的提⾼,并没有实质上的好处。
1、物化视图的类型:ON DEMAND、ON COMMIT⼆者的区别在于刷新⽅法的不同,ON DEMAND顾名思义,仅在该物化视图“需要”被刷新了,才进⾏刷新(REFRESH),即更新物化视图,以保证和基表数据的⼀致性;⽽ON COMMIT是说,⼀旦基表有了COMMIT,即事务提交,则⽴刻刷新,⽴刻更新物化视图,使得数据和基表⼀致。
2、ON DEMAND物化视图物化视图的创建本⾝是很复杂和需要优化参数设置的,特别是针对⼤型⽣产数据库系统⽽⾔。
但Oracle允许以这种最简单的,类似于普通视图的⽅式来做,所以不可避免的会涉及到默认值问题。
也就是说Oracle给物化视图的重要定义参数的默认值处理是我们需要特别注意的。
物化视图的特点:(1) 物化视图在某种意义上说就是⼀个物理表(⽽且不仅仅是⼀个物理表),这通过其可以被user_tables查询出来,⽽得到佐证;(2) 物化视图也是⼀种段(segment),所以其有⾃⼰的物理存储属性;(3) 物化视图会占⽤数据库磁盘空间,这点从user_segment的查询结果,可以得到佐证;创建语句:create materialized view mv_name as select * from table_name 默认情况下,如果没指定刷新⽅法和刷新模式,则Oracle默认为FORCE和DEMAND。
物化视图的数据怎么随着基表⽽更新? Oracle提供了两种⽅式,⼿⼯刷新和⾃动刷新,默认为⼿⼯刷新。
也就是说,通过我们⼿⼯的执⾏某个Oracle提供的系统级存储过程或包,来保证物化视图与基表数据⼀致性。
这是最基本的刷新办法了。
Oracle物化视图详解
物化视图详解物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。
物化视图存储基于远程表的数据,也可以称为快照。
对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。
如果你想修改本地副本,必须用高级复制的功能。
当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。
对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。
物化视图可以查询表,视图和其它的物化视图。
一、关于物化视图日志:查询物化视图日志文件格式:desc mlog$_lzwmvtest;创建物化视图时默认指定物化视图中存在主键,如果不指定,那么创建的物化视图日志文件的基表必须存在主键,否则会报错Demo:对一个表test创建日志:create materialized view log on test;那么会报:表'LZWMVTEST'不包含主键约束条件这种情况下,就必须指定日志文件结构比如:create materialized view log on test with rowid(具体的针对日志内容方面的在另外一个专题里说明,这里就简述到此)二、关于生成数据和刷新:1>生成数据两大选项:build immediate build deferredBuild immediate:在创建物化视图的同时根据主表生成数据Bulid deferred:在创建物化视图的同时,在物化视图内不生成数据,如果此时没有生成数据,以后可以采取:EXEC DBMS_MVIEW.Refresh(‘MV_name’,’C’),注意必须使用全量刷新,默认是增量刷新,所以这里参数必须是C,因为之前都没有生成数据,所以必须全量。
2>关于刷新²刷新方式:complete fast forceComplete :完全刷新整个物化视图,相当于重新生成物化视图,此时即时增量刷新可用也全量刷新ØFast:当有数据更新时依照相应的规则对物化视图进行更新(此时必须创建物化视图日志(物化视图日志记录了数据更新的日志),关于日志的说明,参照“物化视图日志文件介绍”)ØForce:当增量刷新可用则增量刷新,当增量刷新不可用,则全量刷新(此项为默认选项)不过从实际情况出发,应该尽量不使用默认选项,可以考虑使用增量刷新,对大表特别有效,大表全量更新速度是非常慢的,特别是在存在索引的情况下(在创建物化视图语句中,可能某些限制查询的条件,导致了增量刷新无法使用,这个是需要注意的,具体是哪类语句导致fast刷新不可用,有待总结…..)²刷新时间:on demand on commit start with/ nextOn demand:在需要刷新时进行刷新(人工判断)On commit:在基表上有提交操作时,进行更新Start with:指定首次刷新的时间(一般指定的是当前时间,不过也可以在创建物化视图时不生成数据,则可以考虑在指定的时间刷新,从而生成数据)Next:刷新的周期时间三、基于主键的物化视图和ROWID的物化视图的说明创建物化视图日志时,指定了记录更新的原则即with 后面的primary 或者rowid 或者object id等等,后面,默认是以primary key为记录更新,在物化视图内也是以此为更新的原则。
Oracle中物化视图的使用
询 的速度 问题 显得 尤为重要 。 传统 的查询 要修 改原有 的查 询语句 , rc o al 自动选 VAR HAR2 ( 0) P I e会 C 1 R MARY K Y, E
RFE 等 法 进 刷 : E s 方 来 行 新 RH
。
ED N;
,
oN c .创 建 一 个 J OB, J 1 1 n运 叫 OB ,mi 果 想 修 改 本 地 副 本 , 须 用 高 级 复 制 的功 c MM I 指 出 物 化 视 图 在 对 基 表 的 行 1次 必 O T 进 行 调 用 TE T过 程 的 操作 。 S 能 。当想从一个 表或视 图中抽取数 据时 , D ML 操 作 提 交 的 同 时进 行 刷 新
① 查 询 重 写 ( eyRe r e : 括 Qur w i ) 包 t
Ⅲ 本地操作 :
・ 以 HR 登 录 , 建 基 于 远 端 创
解 决 这 种 问 题 , AC E 中 设 计 了 物 化 E OR L NAB E L Q UE Y R R W R TE 和 S O E I C TT 的 主 键 表 S UD NT 的 物 化 视 T E
或 者 用 来 生 成 基 于 数 据 表 求 和 的 汇 总 表 。 询 物 化 视 图 来 得 到 结 果 。 默 认 为 基 于 远 程 表 的 也 可 以 s
T Y R EW RI E
。
As s L c E E T
u DENT@ M Y
Oracle数据库中物化视图的原理剖析
在10g中,新的DBMS_ADVISOR程序包中的一个名为TUNE_MVIEW的过程使得这项工作变得非常容易:您利用IN参数来调用程序包,这构造了物化视图创建脚本的全部内容。该过程创建一个顾问程序任务(Advisor Task),它拥有一个特定的名称,仅利用OUT参数就能够把这个名称传回给您。
下面是一个例子。因为第一个参数是一个OUT参数,所以您需要在SQL*Plus中定义一个变量来保存它。
C2, ARUP.HOTELS.CITY C3, COUNT(*) M1 FROM ARUP.RESERVATIONS,
ARUP.HOTELS WHERE ARUP.HOTELS.HOTEL_ID =
ARUP.RESERVATIONS.HOTEL_ID GROUP BY
ARUP.RESERVATIONS.CUST_NAME, ARUP.RESERVATIONS.RESV_ID,
create materialized view mv_hotel_resv
refresh fast
enable query rewrite
as
select distinct city, resv_id, cust_name
from hotels h, reservations r
where r.hotel_id = h.hotel_id';
fromdba_tune_mview
wheretask_name = 'TASK_117'
orderby script_type, action_id;
下面是输出:
Oracle物化视图的用法与总结
Oracle物化视图的⽤法与总结物化视图(material view)是什么?物化视图是包括⼀个查询结果的数据库对象,它是远程数据的的本地副本,或者⽤来⽣成基于数据表求和的汇总表。
物化视图存储基于远程表的数据,也可以称为快照(类似于MSSQL Server中的snapshot,静态快照)。
对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。
如果你想修改本地副本,必须⽤⾼级复制的功能。
当你想从⼀个表或视图中抽取数据时,你可以⽤从物化视图中抽取。
对于数据仓库,创建的物化视图通常情况下是聚合视图,单⼀表聚合视图和连接视图。
(这个是基于本地的基表或者视图的聚合)。
物化视图,说⽩了,就是物理表,只不过这张表通过oracle的内部机制可以定期更新,将⼀些⼤的耗时的表连接⽤物化视图实现,会提⾼查询的效率。
当然要打开查询重写选项;Material View的主要作⽤1. 实现两个数据库之间的数据同步,可以存在时间差。
2. 如果是远程链接数据库的场景时,提⾼查询速度。
(由于查询逻辑复杂,数据量⽐较⼤,导致每次查询视图的时候,查询速度慢,效率低下)物化视图的刷新⽅式和⽅法1. 刷新的⽅式FastCompleteFource2. 刷新的⽅法DBMS_REFRESH.RefreshDBMS_MVIEW.RefreshEXEC DBMS_MVIEW.refresh('BXJ_OBJECTS_MV_T1','C');EXEC DBMS_REFRESH.refresh('REP_MVIEWGROUP');物化视图的刷新⽅式和⽅法(1).在源数据库建⽴mview log⽇志⽂件create materialized view log on w_1 ;----注:(TEST为表名或者视图名,关于视图上建⽴物化视图,见基于视图的物化视图----创建物化视图语句:(2).在统计数据建⽴materializad view 语法Create materialized view MV_TEST----MVTEST为物化视图名Build immediate----创建时⽣成数据对应的是build deferredRefresh fast----增量刷新On commit----在基表有更新时提交,这⾥该句对视图⽆效With rowid----这⾥创建基于rowid的物化视图,对应的是 primary keyAsSelect * from TEST;----⽣成物化视图数据语句或者 CREATE MATERIALIZED VIEW MV_TableNameBUILD IMMEDIATE --创建时⽴即刷新REFRESH FORCE --如果可以快速刷新则进⾏快速刷新,否则完全刷新ON DEMAND --刷新⽅式START WITH SYSDATE --第⼀次刷新时间NEXT SYSDATE+1/12 --刷新时间间隔AS SELECT 1 id ‘A’ name FROM dual;(3).调⽤时进⾏刷新dbms_refresh.refresh('W_1')创建物化视图CREATE MATERIALIZED VIEW bxj_objects_mv_t1 REFRESH FAST AS SELECT * FROM apps.bxj_objects_t1;CREATE MATERIALIZED VIEW bxj_objects_mv_t2 REFRESH FORCE AS SELECT * FROM bxj_objects_t2;CREATE MATERIALIZED VIEW bxj_objects_mv_t3 REFRESH COMPLETE AS SELECT * FROM bxj_objects_t3;ON DEMAND和ON COMMIT物化视图的区别ON DEMAND和ON COMMIT物化视图的区别在于其刷新⽅法的不同,ON DEMAND顾名思义,仅在该物化视图“需要”被刷新了,才进⾏刷新(REFRESH),即更新物化视图,以保证和基表数据的⼀致性;⽽ON COMMIT是说,⼀旦基表有了COMMIT,即事务提交,则⽴刻刷新,⽴刻更新物化视图,使得数据和基表⼀致。
Oracle物化视图,物化视图日志,增量刷新同步远程数据库
Oracle物化视图,物化视图⽇志,增量刷新同步远程数据库1.创建DBLINK-- Drop existing database linkdrop public database link LQPVPUB;-- Create database linkCREATE DATABASE LINK LQPVPUB 6CONNECT TO "INTEPDM" identified by "password" 8using "LQPVPUB"2.创建物化视图⽇志(远程主机操作)CREATE MATERIALIZED VIEW LOG ON dm_basicmodelWITH PRIMARY KEYINCLUDING NEW VALUES;3.创建物化视图CREATE MATERIALIZED VIEW mv_model --创建物化视图BUILD IMMEDIATE --在视图编写好后创建REFRESH FAST WITH PRIMARY KEY--根据主表主键增量刷新(FAST,增量)ON DEMAND -- 在⽤户需要时,由⽤户刷新ENABLE QUERY REWRITE --可读写ASSELECT bm_id,bm_partid,bm_code from dm_basicmodel@LQPVPUB t --查询语句4.删除物化视图和⽇志⽇志和物化视图要分开删除DROP MATERIALIZED VIEW LOG ON GG_ZLX_ZHU@TOCPEES;DROP MATERIALIZED VIEW GG_ZLX_ZHU;5.物化视图更新CREATE OR REPLACE PROCDURE P_MVIEW_REFRESH ASBEGINDBMS_MVIEW.REFRESH('GG_ZLX_ZHU,GG_ZLX_FU','ff');END P_MVIEW_REFRESH;注意:5.1、如果需要同时刷新多个物化视图,必须⽤逗号把各个物化视图名称连接起来,并对每个视图都要指明刷新⽅式(f、增量刷新,c、完全刷新,?、强制刷新)。
Oracle中的物化视图
物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。
物化视图存储基于远程表的数据,也可以称为快照。
物化视图可以查询表,视图和其它的物化视图。
通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。
对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。
如果你想修改本地副本,必须用高级复制的功能。
当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。
对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。
本篇我们将会看到怎样创建物化视图并且讨论它的刷新选项。
在复制环境下,创建的物化视图通常情况下主键,rowid,和子查询视图。
1.主键物化视图:下面的语法在远程数据库表emp上创建主键物化视图SQL> CREATE MATERIALIZED VIEW mv_emp_pkREFRESH FAST START W ITH SYSDATENEXT SYSDATE + 1/48WITH PRIMARY KEYAS SELECT * FROM emp@remote_db;Materialized view created.注意:当用FAST选项创建物化视图,必须创建基于主表的视图日志,如下: SQL> CREATE MATERIALIZED VIEW LOG ON emp;Materialized view log created.2.Rowid物化视图下面的语法在远程数据库表emp上创建Rowid物化视图SQL> CREATE MATERIALIZED VIEW mv_emp_rowidREFRESH W ITH ROWIDAS SELECT * FROM emp@remote_db;Materialized view log created.3.子查询物化视图下面的语法在远程数据库表emp上创建基于emp和dept表的子查询物化视图SQL> CREATE MATERIALIZED VIEW mv_empdeptAS SELECT * FROM emp@remote_db eWHERE EXISTS(SELECT * FROM dept@remote_db dWHERE e.dept_no = d.dept_no)Materialized view log created.REFRESH 子句[refresh [fastcompleteforce][on demand commit][start with date] [next date][with {primary keyrowid}]]Refresh选项说明:a. oracle用刷新方法在物化视图中刷新数据.b. 是基于主键还是基于rowid的物化视图c. 物化视图的刷新时间和间隔刷新时间Refresh方法-FAST子句增量刷新用物化视图日志(参照上面所述)来发送主表已经修改的数据行到物化视图中.如果指定REFRESH FAST子句,那么应该对主表创建物化视图日志SQL> CREATE MATERIALIZED VIEW LOG ON emp; Materialized view log created.对于增量刷新选项,如果在子查询中存在分析函数,则物化视图不起作用。
Oracle创建物化视图
由于要和远程端的数据库表格进行融合,假若不在一个库中,操作会非常繁琐,由此,我们拟采用物化视图来解决这个问题,下面我们来介绍一下他的基本步骤:两台机器,一台机器的IP为:172.16.10.13,一台为172.16.10.15我们先将15机器上的一个表格,远程物化到13上。
第一,创建测试用户:15机器执行如下:SQL> create user testuser1 identified by hope;用户已创建SQL> grant connect,resource to testuser1;授权成功。
13机器执行如下:SQL> create user testuser2 identified by hope;用户已创建SQL> grant dba to testuser2;授权成功。
第二.在testuser1下创建一张表SQL> conn testuser1/hope已连接。
SQL> create table student(2 pid int primary key,3 name varchar(20)4 );表已创建。
第三,创建物化视图日志SQL> create materialized view log on student;实体化视图日志已创建。
第四,创建testuser2到testuser1的dblinkSQL> create database link conn_testuser1 connect to testuser1 identified by hope2 using '(DESCRIPTION =3 (ADDRESS_LIST =4 (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.10.15)(PORT = 1521))5 )6 (CONNECT_DATA =7 (SERVICE_NAME = tykm)8 )9 )'10 ;数据库链接已创建。
Oracle性能调优之物化视图用法简介
Oracle性能调优之物化视图⽤法简介⽬录⼀、物化视图简介物化视图分类物化视图分类,物化视图语法和as后⾯的sql分为:(1) 基于主键的物化视图(主键物化视图)(2)基于Rowid的物化视图(Rowid物化视图)本博客介绍⼀下Oracle的物化视图,物化视图(Materialized view)是相对与普通视图⽽已的,普通视图是伪表,功能没那么多,⽽物化视图创建是需要占⽤⼀定的存储空间的,物化视图常被应⽤与调优⼀些列表SQL查询,物化视图的基本语法:create materialized view [视图名称]build immediate | deferredrefresh fase | complete | forceon demand | commitstart with [start time]next [next time]with primary key | rowid //可以省略,⼀般默认是主键物化视图as [要执⾏的SQL]ok,解释⼀下这些语法⽤意:build immediate | deferred (视图创建的⽅式):(1) immediate:表⽰创建物化视图的时候是⽣成数据的;(2) deferre:就相反了,只创建物化视图,不⽣成数据refresh fase | complete | force (视图刷新的⽅式):(1) fase:增量刷新,也就是距离上次刷新时间到当前时间所有改变的数据都刷新到物化视图,注意,fase模式必须创建视图⽇志(2) complete:全量更新的,complete⽅式相当于创建视图重新全部查⼀遍(3) force:视图刷新⽅式的默认⽅式,当增量刷新可⽤则增量刷新,当增量刷新不可⽤,则全量刷新,⼀般不要⽤默认⽅式on demand | commit start with ... next ...(视图刷新时间):(1) demand:根据⽤户需要刷新时间,也就是说⽤户要⼿动刷新(2) commit:事务⼀提交,就⾃动刷新视图(3) start with:指定⾸次刷新的时间,⼀般⽤当前时间(4) next:物化视图刷新数据的周期,格式⼀般为“startTime+时间间隔”⼆、实践:创建物化视图上⾯是物化视图主要语法的简介,下⾯可以实践⼀下,创建⼀个主键物化视图ps:创建⼀个名称为MV_T的物化视图,视图创建完成是⽣成数据的,增量刷新,根据⽤户需要刷新,每隔两天刷新⼀次视图create materialized view MV_Tbuild immediaterefresh faston demandstart with sysdatenext sysdate + 2as select * from sys_user;可能遇到问题:(1)、ORA-12014: 表不包含主键约束条件SQL> create materialized view mv_t2 build immediate3 refresh fast4 on demand5 start with sysdate6 next sysdate + 27 as select * from sys_user;as select * from sys_user;第 7 ⾏出现错误:ORA-12014: 表 'SYS_USER' 不包含主键约束条件这是因为as SQL语句的表没创建主键,⽽是使⽤的是基于表的物化视图,解决⽅法是新建主键(2)、ORA-23413: 表不带实体化视图⽇志SQL> create materialized view mv_t2 build immediate3 refresh fast4 on demand5 start with sysdate6 next sysdate + 27 as select * from sys_user;as select * from sys_user;第 7 ⾏出现错误:ORA-23413: 表 "T_BASE"."SYS_USER" 不带实体化视图⽇志这是因为refresh⽅式⽤fast⽅式,fast增量⽅式必须创建视图⽇志create materialized view log on [表名];删除视图⽇志:drop materialized view log on [表名]假如是基于Rowid的物化视图,就可以⽤这种⽅法:create materialized view log on [表名] with rowid;附录:物化视图常⽤SQL删除物化视图:drop materialized view [视图名称];查看物化视图:select mv.* from user_mviews mv where mv.MVIEW_NAME = [视图名称];查看物化视图列:select sg.segment_name, sg.bytes, sg.blocks from user_segments sg where sg.segment_name = [视图名称];⼿动刷新物化视图:exec dbms_mview.refresh([视图名称]);。
物化视图
查询重写
• 是指当对物化视图的基表进行查询时,Oracle会自动判断
能否通过查询物化视图来得到结果,如果可以,则避免了 聚集或连接操作,而直接从已经计算好的物化视图中读取 数据。
物化视图刷新的方式
• On commit – 指物化视图在对基表的DML操作提交(更新数据)的同时进行刷 新。 • On demand – 指物化视图在用户需要的时候进行刷新
物化视图刷新的方法
• 物化视图刷新的方法有:FAST、COMPLETE、FORCE和
NEVER。其中: • FAST刷新:采用增量刷新,只刷新自上次刷新以后进行的修改。
• COMPLETE刷新:对整个物化视图进行完全的刷新。
• FORCE刷新:在刷新时会去判断是否可以进行快速刷新,如果
可以则采用FAST方式,否则采用COMPLETE的方式。(click here and you can know why.) • NEVER指物化视图不进行任何刷新。 • 默认值是FORCE ON DEMAND。
From table1 T1,table2,T2 Where T1.field1=T2.field2
• • • • • • •
What is materialized view? Why do we need materialized view? What is essence(本质)of materialized view? What is Query Rewrite? How many ways have materialized view refreshed? What is premise of creating materialized view? Scott intend to create a materialized view. Whether you are a DBA, pls you grant power to scott. • According the example, fill function of each row on the blanks,pls. • Create materialized view mtrlview_test Build immediate | deffered Refresh fast on commit Enable query rewrite As Select t1.c1,t1.c2,t2.c2,t2.c4 From table1 T1,table2,T2 Where T1.field1=T2.field2
oracle-----视图物化视图
oracle-----视图物化视图什么是视图视图(view),也称虚表, 不占⽤物理空间,这个也是相对概念,因为视图本⾝的定义语句还是要存储在数据字典⾥的。
视图只有逻辑定义。
每次使⽤的时候,只是重新执⾏SQL。
视图是从⼀个或多个实际表中获得的,这些表的数据存放在数据库中。
那些⽤于产⽣视图的表叫做该视图的基表。
⼀个视图也可以从另⼀个视图中产⽣。
视图的定义存在数据库中,与此定义相关的数据并没有再存⼀份于数据库中。
通过视图看到的数据存放在基表中。
视图看上去⾮常象数据库的物理表,对它的操作同任何其它的表⼀样。
当通过视图修改数据时,实际上是在改变基表中的数据;相反地,基表数据的改变也会⾃动反映在由基表产⽣的视图中。
由于逻辑上的原因,有些Oracle视图可以修改对应的基表,有些则不能(仅仅能查询)。
还有⼀种视图:物化视图(MATERIALIZED VIEW ),也称实体化视图,快照(8i 以前的说法),它是含有数据的,占⽤存储空间。
视图的作⽤1)提供各种数据表现形式, 可以使⽤各种不同的⽅式将基表的数据展现在⽤户⾯前, 以便符合⽤户的使⽤习惯(主要⼿段: 使⽤别名);2)隐藏数据的逻辑复杂性并简化查询语句, 多表查询语句⼀般是⽐较复杂的, ⽽且⽤户需要了解表之间的关系, 否则容易写错; 如果基于这样的查询语句创建⼀个视图, ⽤户就可以直接对这个视图进⾏"简单查询"⽽获得结果. 这样就隐藏了数据的复杂性并简化了查询语句.这也是oracle提供各种"数据字典视图"的原因之⼀,all_constraints就是⼀个含有2个⼦查询并连接了9个表的视图(在catalog.sql中定义);3)执⾏某些必须使⽤视图的查询. 某些查询必须借助视图的帮助才能完成. ⽐如, 有些查询需要连接⼀个分组统计后的表和另⼀表, 这时就可以先基于分组统计的结果创建⼀个视图, 然后在查询中连接这个视图和另⼀个表就可以了;4)提供某些安全性保证. 视图提供了⼀种可以控制的⽅式, 即可以让不同的⽤户看见不同的列, ⽽不允许访问那些敏感的列, 这样就可以保证敏感数据不被⽤户看见;5)简化⽤户权限的管理. 可以将视图的权限授予⽤户, ⽽不必将基表中某些列的权限授予⽤户, 这样就简化了⽤户权限的定义。
Oracle 的物化视图
ORACLE物化视图一、------------------------------------------------------------------------------------------物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。
物化视图存储基于远程表的数据,也可以称为快照。
物化视图可以查询表,视图和其它的物化视图。
通常情况下,物化视图被称为主表(在复制期间)或明细表(在数据仓库中)。
对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。
如果你想修改本地副本,必须用高级复制的功能。
当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。
对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。
本篇我们将会看到怎样创建物化视图并且讨论它的刷新选项。
在复制环境下,创建的物化视图通常情况下主键,rowid,和子查询视图。
1.主键物化视图:下面的语法在远程数据库表emp上创建主键物化视图SQL> CREATE MATERIALIZED VIEW mv_emp_pkREFRESH FAST START WITH SYSDATENEXT SYSDATE + 1/48WITH PRIMARY KEYAS SELECT * FROM emp@remote_db;Materialized view created.注意:当用FAST选项创建物化视图,必须创建基于主表的视图日志,如下:SQL> CREATE MATERIALIZED VIEW LOG ON emp;Materialized view log created.2.Rowid物化视图下面的语法在远程数据库表emp上创建Rowid物化视图SQL> CREATE MATERIALIZED VIEW mv_emp_rowidREFRESH WITH ROWIDAS SELECT * FROM emp@remote_db;Materialized view log created.3.子查询物化视图下面的语法在远程数据库表emp上创建基于emp和dept表的子查询物化视图SQL> CREATE MATERIALIZED VIEW mv_empdeptAS SELECT * FROM emp@remote_db eWHERE EXISTS (SELECT * FROM dept@remote_db dWHERE e.dept_no = d.dept_no)Materialized view log created.REFRESH 子句 [refresh [fast|complete|force] [on demand | commit][start with date] [next date] [with {primary key|rowid}]]Refresh选项说明:a. oracle用刷新方法在物化视图中刷新数据.b. 是基于主键还是基于rowid的物化视图c. 物化视图的刷新时间和间隔刷新时间Refresh方法-FAST子句增量刷新用物化视图日志(参照上面所述)来发送主表已经修改的数据行到物化视图中.如果指定REFRESH FAST子句,那么应该对主表创建物化视图日志SQL> CREATE MATERIALIZED VIEW LOG ON emp;Materialized view log created.对于增量刷新选项,如果在子查询中存在分析函数,则物化视图不起作用。
Oracle如何根据物化视图日志快速刷新物化视图
Oracle如何根据物化视图⽇志快速刷新物化视图Oracle物化视图的快速刷新机制是通过物化视图⽇志完成的。
Oracle如何通过⼀个物化视图⽇志就可以⽀持多个物化视图的快速刷新呢,本⽂简单的描述⼀下刷新的原理。
⾸先,看⼀下物化视图的结构:SQL> create table t(id number, name varchar2(30), num number);表已创建。
SQL> create materialized view log on t with rowid, sequence(id, name) including new values;实体化视图⽇志已创建。
SQL> desc mlog$_tID和NAME是建⽴物化视图⽇志时指定的基表中的列,它们记录每次DML操作对应的ID和NAME的值。
M_ROW$$保存基表的ROWID信息,根据M_ROW$$中的信息可以定位到发⽣DML操作的记录。
SEQUENCE$$根据DML操作发⽣的顺序记录序列的编号,当刷新时,根据SEQUENCE$$中的顺序就可以和基表中的执⾏顺序保持⼀致。
SNAPTIME$$列记录了刷新操作的时间。
DMLTYPE$$的记录值I、U和D,表⽰操作是INSERT、UPDATE还是DELETE。
OLD_NEW$$表⽰物化视图⽇志中保存的信息是DML操作之前的值(旧值)还是DML操作之后的值(新值)。
除了O和N这两种类型外,对于UPDATE操作,还可能表⽰为U。
CHANGE_VECTOR$$记录DML操作发⽣在那个或那⼏个字段上。
根据上⾯的描述,可以发现,当刷新物化视图时,只需要根据SEQUENCE$$列给出的顺序,通过M_ROW$$定位到基表的记录,如果是UPDATE操作,通过CHANGE_VECTOR$$定位到字段,然后根据基表中的数据重复执⾏DML操作。
如果物化视图⽇志只针对⼀个物化视图,那么刷新过程就是这么简单,还需要做的不过是在刷新之后将物化视图⽇志清除掉。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle物化视图:创建最简单物化视图 2008年09月19日社区交流关键字:触发器语法Oracle物化视图跟踪sql语句密码丢失数据仓储Oracle 9i个人版内容摘要:物化视图是Oracle令人激赏的功能之一,在OLAP和OLTP系统都有广泛应用。
本系列文章对其进行由浅入深的案例讲解。
本文侧重在最简单的ON DEMAND和ON COMMIT 物化视图的讨论。
物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。
普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL 语句的查询。
这样对整体查询性能的提高,并没有实质上的好处。
Oracle最早在OLAP系统中引入了物化视图的概念。
但后来很多大型OLTP系统中,发现类似统计的查询是无可避免,而这些查询操作如果很频繁,对整体数据库性能是很致命的。
于是Oracle开始不断的改进物化视图,使得其也开始合适OLTP系统。
从Oracle 8i到现在,功能已经相对比较完备了。
本文是Oracle物化视图系列文章的第一篇,有两个主要目的,来体验一下创建ON DEMAND和ON COMMIT物化视图的方法。
ON DEMAND和ON COMMIT物化视图的区别在于其刷新方法的不同,ON DEMAND顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;而ON COMMIT是说,一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。
1、第一个ON DEMAND物化视图1.1、创建ON DEMAND物化视图下面创建一个最简单的物化视图,这个物化视图的定义很类似于普通视图的创建语句,只是多了一个materialized,但就是这个单词,造成了物化视图和普通视图(虚拟表)的天壤之别,也引申出后面很多的事情,呵呵。
本例中需要特别注意的是,Oracle给物化视图的重要定义参数的默认值处理,在下面的例子中会有特别说明。
因为物化视图的创建本身是很复杂和需要优化参数设置的,特别是针对大型生产数据库系统而言。
但Oracle允许以这种最简单的,类似于普通视图的办法来做,所以不可避免的会涉及到默认值问题。
像我们这样,创建物化视图时未作指定,则Oracle按ON DEMAND模式来创建。
从下例中可以看出:1) 物化视图在某种意义上说就是一个物理表(而且不仅仅是一个物理表),这通过其可以被user_tables查询出来,而得到佐证;2) 物化视图也是一种段(segment),所以其有自己的物理存储属性;3) 物化视图会占用数据库磁盘空间,这点从user_segment的查询结果,可以得到佐证。
创建物化视图--获取数据库rdbms版本信息SQL>select*fromv$version;BANNER--------------------------------------------------------------------------------OracleDatabase11gEnterpriseEditionRelease11.1.0.6.0-ProductionPL/SQLRelease11.1.0.6.0-ProductionCORE11.1.0.6.0ProductionTNSfor32-bitWindows:Version11.1.0.6.0-ProductionNLSRTLVersion11.1.0.6.0–Production--创建物化视图SQL>creatematerializedviewmv_testcf2as3select*fromxiaotg.testcf;Materializedviewcreated--分析物化视图,以获得统计信息SQL>analyzetablexiaotg.mv_testcfcomputestatistics;Tableanalyzed--查看物化视图的行数,发现和master表(TESTCF)一样SQL>selecttl.table_name,tl.num_rowsfromuser_tablestlwheretl.table_namein('TESTCF','MV_TEST CF');TABLE_NAMENUM_ROWS----------------------------------------MV_TESTCF80000TESTCF80000--查看物化视图的存储参数SQL>colsegment_namefora24SQL>selectsg.segment_name,sg.bytes,sg.blocksfromuser_segmentssgwheresg.segment_name=' MV_TESTCF';SEGMENT_NAMEBYTESBLOCKS--------------------------------------------MV_TESTCF94371841152查看物化视图关键定义--查看物化视图的定义设置,请关注蓝色字体部分。
--这表明,默认情况下,如果没指定刷新方法和刷新模式,则Oracle默认为FORCE和DEMAND。
--其他的集中刷新方法和刷新模式以后将分别予以介绍。
SQL> select mv.* from user_mviews mv where mv.MVIEW_NAME = 'MV_TESTCF';(为增加查询结果的可读性,下面进行了行列的互转)OWNERXIAOTGMVIEW_NAMEMV_TESTCFCONTAINER_NAMEMV_TESTCFQUERYQUERY_LEN80UPDATABLENUPDATE_LOGMASTER_ROLLBACK_SEGMASTER_LINKREWRITE_ENABLEDNREWRITE_CAPABILITYGENERALREFRESH_MODEDEMANDREFRESH_METHODFORCEBUILD_MODEIMMEDIATEFAST_REFRESHABLEDMLLAST_REFRESH_TYPECOMPLETELAST_REFRESH_DATE2008-9-915:02STALENESSFRESHAFTER_FAST_REFRESHFRESHUNKNOWN_PREBUILTNUNKNOWN_PLSQL_FUNCNUNKNOWN_EXTERNAL_TABLENUNKNOWN_CONSIDER_FRESHNUNKNOWN_IMPORTNUNKNOWN_TRUSTED_FDNCOMPILE_STATEVALIDUSE_NO_INDEXNSTALE_SINCENUM_PCT_TABLES0NUM_FRESH_PCT_REGIONSNUM_STALE_PCT_REGIONS1.2、测试ON DEMAND物化视图的更新特性物化视图最重要的功能和特性之一,就是其数据会随着基表(或称主表,master表,本例中为TESTCF)的变化而变,基表数据增了,物化视图数据会变多;基表数据删了,物化视图数据也会变少。
但怎么更新?或者说物化视图的数据怎么随着基表而更新?Oracle提供了两种方式,手工刷新和自动刷新,像我们这种,在物化视图定义时,未作任何指定,那当然是默认的手工刷新了。
也就是说,通过我们手工的执行某个Oracle提供的系统级存储过程或包,来保证物化视图与基表数据一致性。
这是最基本的刷新办法了。
但所谓的自动刷新,其实也就是Oracle会建立一个job,通过这个job来调用相同的存储过程或包,加以实现,这在本系列文章的第2篇会将以详细阐述。
下面将测试INSERT,UPDATE和DELETE的测试方法类似,大家有兴趣的话,可以自己试一试。
需要注意的是,下面暂不讨论如何刷新ON DEMAND物化视图,这是下一篇文章的内容。
下面仅仅关注ON DEMAND物化视图的特性及其和ON COMMIT物化视图的区别,即前者不刷新(手工或自动)就不更新物化视图,而后者不刷新也会更新物化视图,——只要基表发生了COMMIT。
在基表插入测试数据基表数据插入后,会发现,物化视图并不会随之更新。
--检查基表和物化视图是否有80001这一行记录。
SQL>colidfora10;SQL>colnamefora30;SQL>select*fromxiaotg.testcftwheret.id=80001;IDNAME----------------------------------------SQL>select*fromxiaotg.mv_testcftwheret.id=80001;IDNAME------------------------------------------插入测试数据80001--这时发现,基表有数据,但物化视图并没有SQL>insertintoxiaotg.testcf2values(80001,'xiaotghehe');1rowinsertedSQL>commit;Commitcomplete1.2.2 测试物化视图数据是否更新从下面的实验可以看出,物化视图数据不会更新,即使等上1分钟、1小时、或者1天。
关于如何使得ON DEMAND物化视图数据被更新,参加本系列的第二篇文章哈:)SQL>select*fromxiaotg.testcftwheret.id=80001;IDNAME----------------------------------------80001xiaotgheheSQL>select*fromxiaotg.mv_testcftwheret.id=80001;IDNAME----------------------------------------SQL>2、第一个ON COMMIT物化视图最简单的ON COMMIT物化视图的创建,和上面创建ON DEMAND的物化视图区别不大。
因为ON DEMAND是默认的,所以ON COMMIT物化视图,需要再增加个参数即可。
2.1 创建ON COMMIT物化视图创建物化视图需要注意的是,无法在定义时仅指定ON COMMIT,还得附带个参数才行,本例中附带refresh force,关于这个参数的意思,以后将加以阐述。
--创建ON COMMIT物化视图SQL>creatematerializedviewmv_testcf22refreshforceoncommit3as4select*fromxiaotg.testcf;MaterializedviewcreatedSQL>--分析物化视图和基表SQL>analyzetablexiaotg.mv_testcf2computestatistics;TableanalyzedSQL>analyzetablexiaotg.testcfcomputestatistics;Tableanalyzed--查看当前基表和物化视图的行数SQL>selecttl.table_name,tl.num_rowsfromuser_tablestlwheretl.table_namein('TESTCF','MV_TEST CF2');TABLE_NAMENUM_ROWS----------------------------------------MV_TESTCF280000TESTCF80000查看物化视图关键定义可以从DBA_MVIEWS中看出,刷新模式为COMMIT,这也是它和上面ON DEMAND 物化视图的唯一区别。