原文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;

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

  1. Oracle 物化视图 说明

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

  2. [O]ORACLE物化视图的使用

    用于数据复制的物化视图 物化视图的一个主要功能就是用于数据的复制,Oracle推出的高级复制功能分为两个部分,多主复制和物化视图复制.而物化视图复制就是利用了物化视图的功能. 物化视图复制包含只读物化 ...

  3. Oracle物化视图的创建及使用

    oracle物化视图 一.oracle物化视图基本概念  物化视图首先需要创建物化视图日志,  oracle依据用户创建的物化视图日志来创建物化视图日志表,  物化视图日志表的名称为mlog$_后面跟 ...

  4. ORACLE物化视图(物理视图)

    百度文库 http://wenku.baidu.com/view/f78f55c68bd63186bcebbc4b.html ORACLE物化视图 一.------------------------ ...

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

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

  6. Oracle物化视图的一般使用

    普通视图和物化视图根本就不是一个东西,说区别都是硬拼到一起的,首先明白基本概念,普通视图是不存储任何数据的,他只有定义,在查询中是转换为对应的定义SQL去查询,而物化视图是将数据转换为一个表,实际存储 ...

  7. ORACLE物化视图具体解释

    一.物化的一般使用方法物化视图是一种特殊的物理表,"物化"(Materialized)视图是相对普通视图而言的.普通视图是虚拟表.应用的局限性大,不论什么对视图的查询.oracle ...

  8. 解决oracle 物化视图刷新失败

    oracle 物化视图刷新失败可能原因: 1.视图未建立物化视图日志 2.基表为授权给用户 1.物化视图语法 create materialized view [view_name] refresh ...

  9. oracle物化视图

    物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的.普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询. 这样对整 ...

随机推荐

  1. ArchLinux For Arm 树莓派开机自启动脚本rc.local

    今天折腾了下树莓派的迅雷固件,迅雷的安装很顺利,解压直接运行portal 就搞定了, 但是自启动就有问题了,由于新版的ArchLinux切换到systemd,不但rc.conf省了,连rc.local ...

  2. 安装Qt5.9

    目前,作为一个重量级编程开发工具,Qt 已经正式发布了 5.9.0 版本.相比之前的 5.7,5.8 版本,新版本在性能和功能上有了大幅改善和提高,并由此获得了官方的明确表态:这将是继 5.6 之后的 ...

  3. 基于bootstrap的后台管理系统

    ace metro'nic 基于bootstrap的后台admin system ace [eis], 扑克牌中的A 表示 非常棒, 杰出, 顶好的... gallery: 画廊, 走廊; 在网页中常 ...

  4. JavaScript:正则表达式 应用

    1. var data = "<table id=\"test\"><tr class=\"light\"><td> ...

  5. codeforces 1097 Hello 2019

    又回来了.. A - Gennady and a Card Game 好像没什么可说的了. #include<bits/stdc++.h> using namespace std; cha ...

  6. C# 查出数据表DataTable 清除一列中的重复项保留其他项

    http://bbs.csdn.net/topics/391085792     DataTable 老表= 新表.AsEnumerable().GroupBy(p => p["姓名& ...

  7. Ubuntu 14.04下 Java通用安装方法

    参考: 解决Floodlight1.2+Mininet问题及使用安装 Ubuntu下安装JDK1.7图文详解 Ubuntu 14.04下 Java通用安装方法 1.到oracle官网下下载对应jdk包 ...

  8. NS3 一个小问题

    可能会在执行./waf 命令的时候遇到这个问题,比如我想编译 /home/wasdns/Documents/NS3/ns-3.17/scratch 目录下的一个文件:newnsthree.cpp 编译 ...

  9. codeforces 251 div2 D. Devu and his Brother 三分

    D. Devu and his Brother time limit per test 1 second memory limit per test 256 megabytes input stand ...

  10. c++ 多继承 公有,私有,保护

    昨天学习三种继承方式,有些比喻十分形象,特此分享. 首先说明几个术语: 1.基类 基类比起它的继承类是个更加抽象的概念,所描述的范围更大.所以可以看到有些抽象类,他们设计出来就是作为基类所存在的(有些 ...