`
maosheng
  • 浏览: 565407 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle 实体化视图

阅读更多
简介:
MView中文名称为实体化视图(Materialized View),相对于普通的视图来说,MView的不同之处在于MView实体化视图管理存储数据,占据数据库的物理空间。MView的结果会保存在一个普通的数据表中,在对MView进行查询的时候不再会对创建MView的基表进行查询,而是直接查询MView对应的结果表,然后通过定期的刷新机制来更新MView表中的数据。

物化视图可以查询表,视图和其它的物化视图。

MView在实际中的主要作用
1、减轻网络负担:通过MV将数据从一个数据库分发到多个不同的数据库上,通过对多个数据库访问来减轻对单个数据库的网络负担。
2、搭建分发环境:通过从一个中央数据库将数据分发到多个节点数据库,达到分发数据的目的。
3、复制数据子集:MV可以进行行级/列级的筛选,这样可以复制需要的那一部分数据。

实体化视图是用于汇总,预计算,复制或分发数据的对象, 在大型的数据库中使用它可以提高涉及到的SUM,COUNT,AVG,MIN,MAX等的表的查询的速度。

创建实体化视图管理的用户的权限必须有: CREATE ANY MATERIALZED VIEW,CREATE TABLE,CREATE VIEW,SELECT等。

创建实体化视图:
创建物化视图主要语法:
create materialized view [view_name]
     {TABLESPACE (表空间名)}              --保存表空间
     {BUILD [DEFERRED|IMMEDIATE(默认值)]} --延迟刷新还是立即刷新
refresh [fast|complete|force]
[
on [commit|demand] |
start with (start_time) next (next_time)
]
as
{创建物化视图用的查询语句}

相关参数说明:
1,
Build子句:定义创建方式,包括BUILD IMMEDIATE和BUILD DEFERRED两种
BUILD IMMEDIATE 在创建实体化视图的时候就生成数据,默认 BUILD IMMEDIATE 
BUILD DEFERRED 在创建时不生成数据,以后根据需要在生成数据

2,
Refresh子句:定义数据同步刷新,当基表发生了DML操作后,实体化视图何时采用哪种方式和基表进行同步,语法:
[refresh [fast | complete | force]
         [on demand | commit]
         [start with date]
         [next date]
         [with {primary key | rowid}]
]

FAST 采用增量刷新,只刷新自上次刷新以后进行的修改,如果指定REFRESH FAST子句,那么应该对主表创建物化视图日志,如果没有建立MView Log的话要进行快速刷新的话会报错
注意:对于增量刷新选项,如果在子查询中存在分析函数,则物化视图不起作用。

COMPLETE 对整个物化视图进行完全的刷新

FORCE(默认) Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用Fast方式,否则采用Complete的方式,Force选项是默认选项

ON DEMAND(默认) 物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新
ON COMMIT 实体化视图在对基表的DML操作提交的同时进行刷新

START WITH 第一次刷新时间
NEXT 刷新时间间隔 
WITH PRIMARY KEY(默认) 生成主键实体化视图,也就是说实体化视图是基于表的主键,而不是ROWID(对应于ROWID子句)。 为了生成PRIMARY KEY子句,应该在表上定义主键,否则应该用基于ROWID的实体化视图。主键实体化视图允许识别实体化视图表而不影响实体化视图增量刷新的可用性
WITH ROWID 只有一个单一的主表,不能包括下面任何一项:
●Distinct
●聚合函数
●Group by
●子查询
●连接
●SET操作

3,
Query Rewrite子句,定义查询重写
包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。分别指出创建的实体化视图是否支持查询重写。查询重写是指当对实体化视图的基表进行查询时,Oracle会自动判断能否通过查询实体化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的实体化视图中读取数据
ENABLE QUERY REWRITE 支持查询重写
DISABLE QUERY REWRITE 不支持查询重写,默认DISABLE QUERY REWRITE

注意:如果需要进行快速刷新,则需要建立实体化视图日志。实体化视图日志根据不同实体化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。

物化视图可以进行分区。而且基于分区的物化视图可以支持分区变化跟踪(PCT)。具有这种特性的物化视图,当基表进行了分区维护操作后,仍然可以进行快速刷新操作。

创建多表关联的实体化视图:
实体化视图包含多表关联,但不包含聚合操作,仅包含表关联的实体化视图同样支持在两种情况下刷新:
ON COMMIT 和 ON DEMAND。在 ON COMMIT 下,当基表发生DML操作并提交commit 的时候,实体化视图被刷新。
Oracle不允许实体化视图中有self-jions 的存在。
假如指定刷新方式为REFRESH FAST, oracle 执行附加的校验,以确定fast refresh能被执行。这些附加的检查包括:
1 每个基表下必须创建相应的 materialized view log
2 每个基表的rowid 必须在实体化视图的select 语句中出现
3 如果存在外联接,在where 子句不能有任何的selections.并且,所有的关联必须以AND 相连,并且用“=”操作符。
4 如果存在外联接,唯一性约束必须存在于外联的 inner table 的相关列中。

创建聚合类型的实体化视图:
为了能够进行快速刷新(fast refersh),在select 语句中必须包含所有在group by中出现的列名,并且必须有一个count(*),所有在gorup by 中出现的列都必须有一个count(列名)出现在select 中。同样,所有于实体化视图相关的表上都必须创建实体化和视图日志。有效的聚合函数包括:
SUM, COUNT(x),COUNT(*),AVG,VARIANCE,STDDEV,MIN,MAX被聚合的值可以是任何的
sql表达式。

REFRESH FAST 总结:
一个包含关联和聚合的实体化视图是可能的。但有如下限制:
1,实体化视图中不能包含非复用的表达式(具有实时特征的)。比如SYSDATE and ROWNUM.
2,实体化视图中不能包含RAW or LONG 数据类型。
3,实体化视图相关的表必须创建实体化视图日志,并且满足如下条件
  包含被实体化视图引用到的所有的列。指定with rowid和INCLUDING NEW VALUES.
  如果表的预期操作是inserts/direct-loads, deletes, and updates的混合,指定SEQUENCE子句只用SUM,COUNT,AVG,STDDEV,VARIANCE,MIN and MAX支持fast refresh.
  对于每个聚合agg(expr),必须相应写一个count(expr)与之对应.
  如果VARIANCE(expr)or STDDEV(expr)被指定,那么COUNT(expr)and SUM(expr) 必须被指定。在select列表中必须包含所有group by中出现的列.如果实体化视图有如下的一点,那么fast refresh 只支持常规DML inserts和直接路径的装载(direct loads)
   a 实体化视图包含MIN 或者 MAX
   b 实体化视图包含SUM(expr)但是没有COUNT(expr)
   c 实体化视图中不包含COUNT(*)
   如上的实体化视图称之为insert-only materialized view.

包含MAX or MIN实体化视图在delete或者混合的DML操作之后可以是 fast refresh,条件是视图中没有where 子句。
(10g以上适用)
如果没有外联接,在where 子句中可以包含有选择性的条件和关联
如果实体化视图中包含外联接,fast refresh只支持在outer table被修改的情况。同样,唯一性约束必须存在于inner join table中。如果有外联,所有的关联条件都必须用 AND 连接和必须用 = 操作符。

分享到:
评论

相关推荐

    oracle9i实体化视图.

    实体化视图首先在 Oracle8i 中引入,是称为“概要管理”的组件 的一部分。可能您的公司已经在使用实体化视图,但只知道它的 其他名字,例如概要或聚合表。在这里我们讨论如何创建和管理 实体化视图,还讨论查询重写...

    Oracle数据仓库实体化视图的研究与应用

    ### Oracle数据仓库实体化视图的研究与应用 #### 摘要 本文深入探讨了Oracle数据仓库中的实体化视图(Materialized View)及其在实际应用中的重要性。通过研究,我们发现实体化视图是一种有效管理概要数据的方法,...

    Oracle数据仓库实体化视图的研究与应用.pdf

    Oracle数据仓库实体化视图的研究与应用主要集中在如何利用实体化视图提升数据仓库的查询效率和决策支持系统的性能。实体化视图是预先计算和存储的查询结果,用于简化复杂的查询操作,尤其是在数据仓库中处理概要数据...

    论文研究-基于Oracle10g的实体化视图复制研究 .pdf

    3. 实体化视图复制:实体化视图复制是Oracle数据库复制技术的一种特殊类型,它使用实体化视图作为数据复制的目标。实体化视图是基于一个或多个表或视图的数据的只读复制,它可以存储查询结果。实体化视图复制主要...

    常用的oracle表和视图

    ### 常用的Oracle表和视图知识点详解 #### 一、查询某个表在哪些存储过程中被使用 为了高效地了解某个特定表在哪些存储过程中被引用,可以通过以下SQL查询来实现: ```sql SELECT A.NAME AS 过程名称, MIN(A.LINE...

    oracle视图详解

    Oracle 视图详解 Oracle 视图(View)是一种逻辑表,基于一个或多个实际表...在 Oracle 中,还有一种视图:物化视图(MATERIALIZED VIEW),也称实体化视图,快照(8i 以前的说法),它是含有数据的,占用存储空间。

    oracle实体类代码生成器

    Oracle实体类代码生成器是一种工具,它能够自动化地根据数据库中的表结构生成对应的Java实体类代码,极大地提高了开发效率,避免了手动编写这些基础代码的繁琐工作。在Oracle数据库中,实体类通常对应于数据库中的表...

    Mondrian开源OLAP引擎详解.docx

    Mondrian开源OLAP引擎详解 Mondrian 是一个基于 Java 语言的开源 OLAP 引擎,它通过 MDX 语句执行查询,从关系型数据库 RDBMS 中读取数据,然后经过 Java API ...可以利用 Oracle 实体化视图来提高 Mondrian 的效率。

    Navicat Premium操作手册.7z

    3Oracle 外部表访问参数59Oracle 索引组织表59Oracle 索引组织表选项59Oracle 视图60Oracle 函数或过程61Oracle 数据库链接62Oracle 索引63Oracle Java65Oracle 实体化视图66Oracle 实体化视图日志68Oracle 包69...

    ORACLE物化视图

    实体化视图,即Oracle的物化视图,通过预计算常见的联接和聚合操作,显著减少了实时查询时的计算量,使得用户无需遍历整个数据集即可获得所需结果。这一策略在处理大规模数据时尤为重要,因为随着数据库容量的不断...

    Oracle数据库集中复制方法浅议

    4. 在实体化视图站点上创建实体化视图和实体化视图组,同步主站点的数据。 5. 根据需要配置刷新策略,例如每天一次的异步复制。 通过这些步骤,可以实现Oracle数据库的集中复制,确保数据在不同地点的可用性和一致...

    Oracle数据库集中复制方法逐步精细

    4. 实体化视图复制(Materialized View Replication):一个主站点提供数据,一个实体化视图站点接收并存储数据。 5. 实体化视图(Materialized View):在实体化视图站点上创建的表,用于存储主站点数据的副本。 6....

    oracle数据库同步

    无论是实时性要求高的多主体复制环境,还是用于数据分发的实体化视图复制环境,Oracle都能提供强大的支持。在实施具体的同步方案时,企业应当根据实际应用场景,评估不同同步技术的优劣,选择最合适的数据库同步方案...

    Oracle数据库表生成C#实体类

    "Oracle数据库表生成C#实体类"是一个实用的小工具,它的主要目的是自动化这个过程,避免开发者手动编写繁琐的实体类代码。虽然这个工具可能存在一些小问题,但它可以大大提高开发效率,尤其是在处理大量表结构时。 ...

    Oracle 生成实体类.rar

    4. 自动化生成:根据获取的表信息填充模板,生成对应的实体类代码。 5. 添加注释:在每个字段前添加描述性的注释,方便后期阅读和维护。 使用这样的工具或脚本可以显著提高开发效率,避免手动编写大量的重复代码。...

    oracle实体类生成器

    Oracle实体类生成器是一款实用的开发工具,专为程序员设计,能够自动生成C#和Java两种编程语言的实体类代码。这款工具对于处理与Oracle数据库交互的项目特别有用,可以显著提高开发效率,减少手动编写数据访问层代码...

    Oracle9i集中数据复制.pdf

    4. 实体化视图复制(Materialized View Replication):一个主站点提供源数据,一个实体化视图站点接收和更新数据。 5. 实体化视图(Materialized View):在目标站点上创建的与源表或视图对应的表,用于存储复制...

    根据数据库表或视图创建实体类

    在本话题中,我们将深入探讨如何根据数据库表或视图创建实体类,特别是对于支持Oracle和MySQL两种数据库系统的自动化方法。 首先,我们来看创建实体类的重要性。在开发基于数据库的应用程序时,手动编写每个表对应...

Global site tag (gtag.js) - Google Analytics