[转载]oracle物化视图

原文URL:http://lzfhope.blog.163.com/blog/static/636399220124942523943/?suggestedreading&wumii

环境oracle 10g 10.2.0.4  linux 64

要大而专业的看oracle自己的文档-sql参考。

说实话,oracle需要学习的内容太多,每个都看过去,实在太费事。

所以如果能够对物化视图有个概览,那最方便不过。



主要涉及内容

物化视图日志,用于快速刷新所必须的

物化视图

权限,通常不是个难题,因为编译的时候会给你足够的权限提示,没有的话找dba.为了练习,尽可以在测试环境中赋予dba的权限。



什么是物化视图?(物化视图的简单定义)

简而言之,就是具有实体表的视图,而且这个视图还可以根据多种需求和策略进行刷新。此外还有一个非常重要的功能-查询重写(query rewrite)  .查询重写能够在某些时候提高你的查询速度。

所谓查询重写,简而言之,就是oracle 的查询优化器发现有个物化视图的语法和你的SQL差不多,那么就会直接访问物化视图,而不是你原来查询中有关的源表。



物化视图能干什么?

或者说,你能拿物化视图做什么用。

前文简单说了下,此处列出一些重要而想详细的功能:

1)能够提高查询速度,这主要是因为物化视图存储了实际的数据,其次具有查询重写功能。最后,物化视图具有实体表,你也可以在上面建立索引,总之大体上当作一个表用就可以了。

2) 简化了开发任务,意思是开发的人员有的时候,无需直接关注部分sql的性能,而通过dba的努力,使用查询重写来完成性能的提升。

3)减少了工作量,因为物化视图可以定义两种刷新方式:立即刷新,按需刷新。所谓按需刷新就是你自己手动刷新,或者是定时刷新;所谓立即刷新,即视图主表发生变化的时候,视图立即刷新内容。  你可以根据自己的设备情况,应用情况和需求来控制刷新的方式。

4)刷新量的灵活限制,你可以快速是刷新(只刷新变化的),也可以全刷新。看你的需要。



物化视图的语法?

略,这个内容太多,还是去看oracle官方的sql参考吧!



物化视图有关的参数

主要是优化参数(查询重写的)

SQL> show parameters query   NAME                                 TYPE        VALUE ------------------------------------ ----------- ------------------------------ query_rewrite_enabled                string      TRUE query_rewrite_integrity                string      enforced

第一个参数是表示是否支持查询重写,默认是可以

第二个参数是查询重写的支持方式:

STALE_TOLERATED:表示即使细目表中的数据已经发生了变化,也仍然使用物化视图。  TRUSTED :表示物化视图未失效时才使用该视图。但是,查询改写可以使用信任关系,如那些由维度对象或尚未生效的约束所声明的关系。  ENFORCED(缺省):表示当物化视图保证能给出与使用细目表相同的结果时才使用它。使用这一参数意味着查询改写将不使用失效的物化视图或信任关系。  正确的设置决定于应用程序的数据需求。使用失效物化视图的查询改写可能会产生与没有使用查询改写时不同的结果。然而,如果使用细目数据,可能会因为响应查询需要处理的大量数据而使性能恶化。在一个数据仓库中,通常使用TRUSTED完整级别,因为这样才可以保证你只使用那些具有最新数据的物化视图;然而,被声明为正确(可信任)的关系也可用于查询改写。在大多数数据仓库中,这些关系已经在提取、转换和加载(ETL)过程得到了验证,因此不再需要进行验证。



物化视图有关的工具

主要是dbms_mview包。

对于初学者,主要关心两个过程:

explain_mview,看有关sql是否支持物化视图的有关功能。

Explain_Rewrite,看有关查询sql是否支持查询重写。

explain_mview需要有个表:mv_capabilities_table

SQL> desc mv_capabilities_table Name            Type           Nullable Default Comments  --------------- -------------- -------- ------- --------  STATEMENT_ID    VARCHAR2(30)   Y                          MVOWNER         VARCHAR2(30)   Y                          MVNAME          VARCHAR2(30)   Y                          CAPABILITY_NAME VARCHAR2(30)   Y                          POSSIBLE        CHAR(1)        Y                          RELATED_TEXT    VARCHAR2(2000) Y                          RELATED_NUM     NUMBER         Y                          MSGNO           INTEGER        Y                          MSGTXT          VARCHAR2(2000) Y                          SEQ             NUMBER         Y

这可以在$ORACLE_HOME/rdbms/admin/utlxmv.sql找到脚本

explain_rewrite需要表格:rewrite_Table

脚本同样在 $ORACLE_HOME/rdbms/admin/utlxrw.sql中。

除了这些,还有许多的过程,例如:

select * from dba_procedures  where PROCEDURE_NAME LIKE ‘%MVIEW%‘

select * from dba_procedures  where OBJECT_NAME=‘DBMS_SNAPSHOT‘

(DBMS_ MVIEW是DBMS_SNAPSHOT同义词)select * from dba_synonyms where synonym_name like ‘%DBMS_MVIEW%‘

(这意思是10g以后大家不要再叫物化视图为快照了).



物化视图日志简介

物化视图的作用就是为了支持快速刷新

总体上语法比较简单,可以简化为如下:

create materilized view log on  xxxx  with ?  [including|excluding] new values

其中including之后的new values可以不要。

log的重点是with和new values两个句子

with字句是告诉oracle当主表数据变化的时候是否需要记录主键、行号、对象ID,或者是这些标识的组合信息,大略的语法图如下:

object id: 是系统生成或者用户定义的对象标识符,如果源表行有变化,那么就记录对象的ID。当然只有源表是对象表,你才能这么设置。

primary key: 行变化的时候,存储的是主键.。

rowid:变化时候,存储行号.

sequence: 指示哪些额外的排序信息需要存储起来。序列指对于一些一些更新场景的快速刷新有用。

column: 指示哪些列的指需要存储起来(到日志中)。通常这些列是过滤用或者是连接列。

with语句的限制:

1)每个物化视图日志只能设置一个primary key,rowid,object id,sequcen,以及列列表,或者说with 语句后这些关键字只能更上一次,不能这些 with primary key  ,primary key

2)主键列已经是隐式存储在日志中,因此,主键列就不能包含在 column语句中了。

new values 语句

new values语句指示oracle在带更新的DML操作中保存旧数据和新数据到日志中。默认情况,是不记录新新的值。

示例:

create materialized view log on customers with primary key,rowid;  --支持rowid物化视图和join物化视图。

create materialized view log on sales with rowid, sequence(amount_sold,time_id,prod_id) including new values; 支持带统计的物化视图(amount_sold是被sum的列,time_id,prod_id是用于过滤的列)。

例如视图: CREATE MATERIALIZED VIEW products_mv REFRESH FAST ON COMMIT AS SELECT SUM(list_price - min_price), category_id FROM product_information GROUP BY category_id;



物化视图例子

这里给出了一个能够快速及时更新的物化视图例子,比较简单。

例子1:提交的快速刷新物化视图

create table test_1(id int,name varchar2(20),    constraint pk_test_1 primary key(id) )

create table test_2(id int,score int,   constraint pk_test_2 primary key(id)   )    drop materialized   view log on   test_1 drop materialized   view log on   test_2 create materialized view log  on test_1 with rowid create materialized view log  on test_2 with rowid

create materialized view mv_fastrefresh  refresh fast on commit with rowid enable query rewrite as  select a.id,b.name,a.score,a.rowid ra,b.rowid rb      from test_2 a, test_1 b where b.id=a.id

例子二:快速刷新的统计物化视图

create table test_s1(id int,name varchar2(20),    constraint pk_test_s1 primary key(id) )

create table test_s2(id int,mon int, salary number,   constraint pk_test_s2 primary key(id,mon)   )    drop materialized   view log on   test_s1; drop materialized   view log on   test_s2; create materialized view log  on test_s1 with rowid ,sequence(id,name) including new values; create materialized view log  on test_s2 with rowid ,sequence(id,salary) including new values;

create materialized view mv_fastrefresh_sum  refresh fast  with primary key enable query rewrite as  select a.id,b.name,sum(a.salary) totalIncome     from test_s2 a, test_s1 b where b.id=a.id    group by a.id,b.name



补充

2012/05/21

start with or next 不能和on demand ,on commit共存

------------------------------------------------------- 2013、04、18 由于工作需要,经常要编写这样的脚本,故保留下: --先检查,然后有必要就删除 declare   vs_jobname varchar2(30):=‘REFRESH_DMART_JYR‘;   VN_COUNT PLS_INTEGER; begin   /*     创建的时候刷新一次,以后每年12月前后一周的每天晚上23:53进行刷新‘   */   SELECT COUNT(*) INTO VN_COUNT     FROM USER_SCHEDULER_JOBS     WHERE JOB_NAME=VS_JOBNAME;        IF VN_COUNT>0 THEN     DBMS_SCHEDULER.DROP_JOB(VS_JOBNAME,TRUE);   END IF;   DBMS_SCHEDULER.create_job(job_name =>VS_JOBNAME      ,job_type => ‘PLSQL_BLOCK‘     ,job_action => ‘BEGIN  DBMS_MVIEW.REFRESH(‘‘MV_DISTINCT_JYR‘‘,‘‘c‘‘);END;‘     ,start_date => SYSTIMESTAMP     ,repeat_interval => ‘FREQ=YEARLY; BYDATE=1231^SPAN:1W;BYHOUR=23;BYMINUTE=53‘     ,enabled => TRUE     ,auto_drop => FALSE     ,comments => ‘刷新系统交易日‘   );  DBMS_SCHEDULER.run_job(vs_jobname);  end;

时间: 2024-10-27 02:27:04

[转载]oracle物化视图的相关文章

Oracle 物化视图 说明

一.    物化视图概述 Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表.物化视图存储基于远程表的数据,也可以称为快照. 物化视图可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果.物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能:物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性:物化视图需要占用存储

oracle物化视图

原文URL: oracle 10g物化视图简介 2012-05-09 17:33:55|  分类: ORACLE性能 |  标签:oracle  物化视图  |举报|字号 订阅 下载LOFTER我的照片书  | 环境oracle 10g 10.2.0.4  linux 64 要大而专业的看oracle自己的文档-sql参考. 说实话,oracle需要学习的内容太多,每个都看过去,实在太费事. 所以如果能够对物化视图有个概览,那最方便不过. 主要涉及内容 物化视图日志,用于快速刷新所必须的 物化视

oracle 物化视图

我们如果遇到需要从其它系统的数据库中取数据进行统计分析的问题,可疑选择使用ORACLE的ODI工具进行抽数,但是对方提供的数据库用户下没有任何对象,只是有查询所有表的权限,因此无法做数据反向. 于是决定使用物化视图,把对方数据库中的数据拿过来,虽然数据量比较大,但是每月只拿一次,而且如果设置成增量更新,也不会太慢.现在记录下物化视图的创建过程(以一张表为例). 一.准备条件以及备注 假设双方数据库都是ORACLE10g,需要同步过来的表名叫:GG_ZLX_ZHU,对方数据库用户名:usernam

ORACLE物化视图详解

一.物化的一般用法物化视图是一种特殊的物理表,"物化"(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,oracle都实际上转换为视图SQL语句的查询.这样对整体查询性能的提高,并没有实质上的好处. 1.物化视图的类型ON DEMAND.ON COMMIT.二者的区别在于刷新方法的不同,ON DEMAND顾名思义,仅在该物化视图"需要"被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一

[O]ORACLE物化视图的使用

用于数据复制的物化视图 物化视图的一个主要功能就是用于数据的复制,Oracle推出的高级复制功能分为两个部分,多主复制和物化视图复制.而物化视图复制就是利用了物化视图的功能. 物化视图复制包含只读物化视图复制.可更新物化视图复制和可写物化视图复制. 1.只读物化视图复制建立的是源数据库的只读环境. 2.可更新物化视图复制建立基于物化视图双向复制环境. 3.可写物化视图复制在物化视图建立的时候使用了FOR UPDATE,但是没有像可更新物化视图那样添加到物化视图组中,因此本地物化视图可以修改,但是

解决oracle 物化视图刷新失败

oracle 物化视图刷新失败可能原因: 1.视图未建立物化视图日志 2.基表为授权给用户 1.物化视图语法 create materialized view [view_name] refresh [fast|complete|force] [ on [commit|demand] | start with (start_time) next (next_time) ] as {创建物化视图用的查询语句} 以上是Oracle创建物化视图(Materialized View,以下简称MV)时的常

oracle物化视图创建

我们如果遇到需要从其它系统的数据库中取数据进行统计分析的问题,可疑选择使用ORACLE的ODI工具进行抽数,但是对方提供的数据库用户下没有任何对象,只是有查询所有表的权限,因此无法做数据反向. 于是决定使用物化视图,把对方数据库中的数据拿过来,虽然数据量比较大,但是每月只拿一次,而且如果设置成增量更新,也不会太慢.现在记录下物化视图的创建过程(以一张表为例). 一.准备条件以及备注 假设双方数据库都是ORACLE10g,需要同步过来的表名叫:GG_ZLX_ZHU,对方数据库用户名:usernam

oracle物化视图快速更新

建立测试表 create table T_table nologging as select * from dba_objects; create table t_table_1 nologging as select * from dba_tables; --建立日志记录 create materialized view log on T_table with rowid ,sequence(object_name,object_type,owner) including new values

oracle物化视图的两个典型应用场景

物化视图是oracle一个比较有特色的东西,自oracle9i起,应用非常广泛,不像mysql,不支持原生物化视图,要借助flexviews去实现.物化视图到底有什么用呢?要回答这个问题,必须先搞清楚物化视图与普通视图的区别: 物化视图是有一个与之对应的容器表的.容器表是一个跟物化视图同名的"规则"的表,用于存储查询返回的结果集.这是物化视图与普通视图的根本区别,它是有储存结果集的"物理存在"的,而普通视图则没有这个物理存在,只是一个虚表,每访问一次,查询就要执行一