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

Oracle普通视图和实体化视图比较

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

首先我们需要创建表,然后写一个 SELECT 语句 。
SQL> create table xjzhang_table1 (a varchar2(10),b number(10));
表已创建。
SQL> create table xjzhang_table2 (a varchar2(10),b number(10));
表已创建。

向两张表中插入数据
SQL> insert into xjzhang_table1 values ('aaa','00001');
已创建 1 行。
SQL> insert into xjzhang_table1 values ('bbb','00002');
已创建 1 行。
SQL> insert into xjzhang_table2 values ('aa1','00002');
已创建 1 行。
SQL> insert into xjzhang_table2 values ('bb1','00003');
已创建 1 行。
SQL> commit;
提交完成。

然后我们创建一个视图,视图的名称为xjzhang_view
SQL> create view xjzhang_view as select xjzhang_table1.a,xjzhang_table2.b from xjzhang_table1,xjzhang_table2 where xjzhang_table1.b=xjzhang_table2.b;
视图已创建。

然后我们查询视图
SQL> select * from xjzhang_view;
A          B
---------- ----------
bbb        2

然后我们写一个 查询语句
SQL> select xjzhang_table1.a,xjzhang_table2.b from xjzhang_table1,xjzhang_table2 where xjzhang_table1.b=xjzhang_table2.b;
A          B
---------- ----------
bbb        2

可以看到我们查询视图的结果和查询那个SELECT语句的结果是一致的,说明视图是查询一个 或者多个表的 SELECT 语句的描述。

查询一下我们创建的视图
select object_name,object_type,created,status from dba_objects where
object_name='XJZHANG_VIEW';
OBJECT_NAME     OBJECT_TYPE         CREATED        STATUS
--------------- ------------------- -------------- ------- XJZHANG_VIEW    VIEW                24-6月 -09     VALID

同样我们先创建 一张表表名为 xjzhang_table3同时对表插入数据
SQL> create table xjzhang_table3 (a varchar2(10),b number(5));
表已创建。
SQL> insert into xjzhang_table3 values ('aaa','00001');
已创建 1 行。
SQL> insert into xjzhang_table3 values ('bbb','00002');
已创建 1 行。
SQL> commit;
提交完成。

下面我们开始创建实体视图 (这里 我们创建的实体视图 不是自动刷新 而是需要手动去刷新)
SQL> create materialized view xjzhang_mat_view as select * from xjzhang_table3;
实体化视图已创建。

我们查询一下我们创建的实体视图,实体视图的名称为 xjzhang_mat_view
SQL> select * from xjzhang_mat_view;
A          B
---------- ----------
aaa        1
bbb        2

实体视图从某种意义上说是一张物理表可以通过 DBA_TABLES 进行查询来论证一下
SQL>select TABLE_NAME,TABLESPACE_NAME,STATUS from dba_tables where table_name='XJZHANG_MAT_VIEW';
TABLE_NAME                     TABLESPACE_NAME                STATUS
------------------------------ ------------------------------ --------
XJZHANG_MAT_VIEW               SYSTEM                         VALID

我们来查询一下刚才创建的 视图 xjzhang_view
SQL> select TABLE_NAME,TABLESPACE_NAME,STATUS from dba_tables where table_name='XJZHANG_VIEW';
未选定行
可以看出普通视图在DBA_TABLES 中 是没有记录的,也没有对应的表空间
实体视图会占用一定的存储空间,因为它存放了查询的结果集,那么它也是一种段,可以在DBA_SEGMENTS 中查询出

SQL> select SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME from dba_segments where segment_name='XJZHANG_MAT_VIEW';

SEGMENT_NAME         SEGMENT_TYPE       TABLESPACE_NAME
-------------------- ------------------ ------------------------------XJZHANG_MAT_VIEW     TABLE              SYSTEM

同样我们通过 DBA_SEGMENTS 来查询一下我们创建的普通视图
SQL> select SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME from dba_segments where segment_name='XJZHANG_VIEW';
未选定行
可以看出普通视图是不被记录在 DBA_SEGMENTS 中的。

下面我们更新一下XJZHANG_TABLE3 表中的信息,看一下 实体视图的变化信息
SQL> insert into xjzhang_table3 values ('ccc','00003');
已创建 1 行。
SQL> commit;
提交完成。

查询该表的信息
SQL> select * from xjzhang_table3;
A          B
---------- ----------
aaa        1
bbb        2
ccc        3

表的记录增加了一行

我们再来查询实体视图的信息
SQL> select * from xjzhang_mat_view;
A          B
---------- ----------
aaa        1
bbb        2

可以看出实体视图的信息没有发生变化,因为我们在创建实体视图的时候,我们没有指定该视图的刷新方法和刷新模式,所以创建完该实体视图,该视图默认的刷新方法和刷新模式为 FORCE DEMAND

我们可以通过 dba_mviews 这个视图查询我们创建的实体视图的信息
SQL> select a.mview_name,a.refresh_mode,a.refresh_method from dba_mviews a where a.mview_name='XJZHANG_MAT_VIEW';
MVIEW_NAME                     REFRESH_MODE   REFRESH_METHOD
------------------------------ -------------- --------------
XJZHANG_MAT_VIEW               DEMAND         FORCE

这里默认的是手工刷新,所以在这里我们对实体视图进行更新
SQL> EXEC DBMS_MVIEW.REFRESH('XJZHANG_MAT_VIEW')
PL/SQL 过程已成功完成。

然后我们再次查询该实体视图
SQL> SELECT * FROM XJZHANG_MAT_VIEW;
A          B
---------- ----------
aaa        1
bbb        2
ccc        3

这说明了基表的数据发生变化,那么实体视图的内容也将被写入到对应的存储空间中。

我们也可以创建自动更新的实体视图,同样我们创建一张表
SQL> create table xjzhang_table4 (a varchar2(10),b number(5));
表已创建。
SQL> insert into xjzhang_table4 values ('aaa','00001');
已创建 1 行。
SQL> commit;
提交完成。

然后我们创建实体视图
SQL> create materialized view xjzhang_mat_view1 refresh force on commit as select * from xjzhang_table4;
create materialized view xjzhang_mat_view1 refresh force on commit as select * from xjzhang_table4
*
第 1 行出现错误: ORA-12054: 无法为实体化视图设置 ON COMMIT 刷新属性

物化视图的快速刷新采用了增量的机制,在刷新时,只针对基表上发生变化的数据进行刷新。因此快速刷新是物化视图刷新方式的首选。但是快速刷新具有较多的约束,而且对于采用ON COMMIT模式进行快速刷新的物化视图更是如此。对于包含聚集和包含连接的物化视图的快速刷新机制并不相同,而且对于多层嵌套的物化视图的快速刷新更是有额外的要求。如此多的限制一般很难记全,当建立物化视图失败时,Oracle给出的错误信息又过于简单,有时无法使你准确定位到问题的原因。Oracle提供的DBMS_MVIEW.EXPLAIN_MVIEW过程可以帮助你快速定位问题的原因。

Oracle提供的DBMS_MVIEW.EXPLAIN_MVIEW过程可以帮助你快速定位问题的原因,我们来试一下ORACLE 提供的包.
使用EXPLAIN_MVIEW过程首先要建立MV_CAPABILITIES_TABLE表
创建步骤如下
我们执行一个脚本来完成创建
SQL> @?/RDBMS/ADMIN/utlxmv.sql
表已创建。

然后我们执行这个包
SQL> begin
2 dbms_mview.explain_mview('select * from xjzhang_table4');
3 end;
4
/
PL/SQL 过程已成功完成。

然后我们通过 select capability_name, possible, msgtxt from mv_capabilities_table where capability_name like 'REFRESH%'这个脚本来查询结果
SQL> select capability_name, possible, msgtxt from mv_capabilities_table 2 where capability_name like 'REFRESH%'; CAPABILITY_NAME                 P MSGTXT
------------------------------  - ------------------------------ REFRESH_COMPLETE                N 主表中没有任何主键约束条件 REFRESH_FAST                    N
REFRESH_FAST_AFTER_INSERT       N 详细信息表没有实体化视图日志
REFRESH_FAST_AFTER_ONETAB_DML   N 查看禁用 REFRESH_FAST_AFTER_IN SERT 的原因
REFRESH_FAST_AFTER_ANY_DML      N 查看禁用 REFRESH_FAST_AFTER_ON ETAB_DML 的原因 REFRESH_FAST_PCT N PCT 不可能在实体化视图中的任何从表上
已选择6行。

我们可以看到第一条
REFRESH_COMPLETE N 主表中没有任何主键约束条件

我们给 xjzhang_table4 创建主键
SQL> alter table xjzhang_table4 add (constraint xjzhang_pri primary key (b));

表已更改。
然后我们再次创建实体视图
SQL> create materialized view xjzhang_mat_view1 refresh force on commit as select * from xjzhang_table4;
实体化视图已创建。

可以看已经成功创建,我们现在向表中插入数据来查看实体视图的变化情况
我们首先查询一下表中的记录和实体视图中的记录
SQL> select * from xjzhang_table4;
A          B
---------- ----------
aaa        1
SQL> select * from xjzhang_mat_view1; 
A          B
---------- ----------
aaa        1

然后我们向表中插入 一条记录
SQL> insert into xjzhang_table4 values ('afd','00002');
已创建 1 行。
SQL> commit;
提交完成。

我们再来查询一下实体视图的内容
SQL> select * from xjzhang_mat_view1;
A          B
---------- ----------
aaa        1

物化视图为什么没有变化
刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。刷新的模式有两种:ON DEMAND和ON COMMIT。ON DEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。ON COMMIT指出物化视图在对基表的DML操作提交的同时进行刷新。刷新的方法有四种:FAST、COMPLETE、FORCE和NEVE*。FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。默认值是FORCE ON DEMAND

通过上面的这段话我们知道,刷新的类型 一般有两种:ON DEMAND 和 ON COMMIT
ON DEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,这种方法也就是我们长说的使用手工刷新,而ON COMMIT也就是我们长说的 自动刷新,而刷新的方法有四种FAST、COMPLETE、FORCE和NEVER
我们选择的是FORCE 说明ORACLE 是有选择性的刷新,如果可以采用FAST,要不才用COMPLETE

我们采用手工刷新
EXECUTE DBMS_MVIEW.REFRESH('xjzhang_mat_view1','C');
C 代表 完全刷新
F 代表 快速刷新和强制刷新

SQL> select * from xjzhang_mat_view1;
A          B
---------- ----------
aaa        1

SQL> EXECUTE DBMS_MVIEW.REFRESH('xjzhang_mat_view1','C');
PL/SQL 过程已成功完成。
SQL> select * from xjzhang_mat_view1;
A          B
---------- ----------
aaa        1
afd        2

我们删除该实体视图
SQL> drop materialized view xjzhang_mat_view1;
实体化视图已删除。

然后我们重新创建实体视图采用 FAST 方法
SQL> create materialized view xjzhang_mat_view1 refresh fast on commit as select * from xjzhang_table4;
create materialized view xjzhang_mat_view1 refresh fast on commit as select * from xjzhang_table4
*
第 1 行出现错误: ORA-23413: 表 "SYS"."XJZHANG_TABLE4" 不带实体化视图日志
错误提示需要带实体化视图日志

我们来创建实体化视图日志
SQL> create materialized view log on xjzhang_table4 with rowid, sequence (a, b) including new values;
实体化视图日志已创建。

然后我们再次创建实体视图 FAST 方法
SQL> create materialized view xjzhang_mat_view1 refresh fast on commit as select * from xjzhang_table4;
create materialized view xjzhang_mat_view1 refresh fast on commit as select * from xjzhang_table4
*
第 1 行出现错误: ORA-23415: "SYS"."XJZHANG_TABLE4" 的实体化视图日志不记录主键
又提示错误,根据提示错误我们主键失效
SQL> alter table xjzhang_table4 modify constraint xjzhang_pri disable;
表已更改。

然后我们再次创建物化视图 FAST
SQL> create materialized view xjzhang_mat_view1 refresh fast on commit as select * from xjzhang_table4;
create materialized view xjzhang_mat_view1 refresh fast on commit as select * from xjzhang_table4
*
第 1 行出现错误: ORA-12014: 表 'XJZHANG_TABLE4' 不包含主键约束条件
这次系统又提示不包含主键约束条件,我们删除实体视图对应的日志
SQL> DROP MATERIALIZED VIEW LOG ON xjzhang_table4;
实体化视图日志已删除。

我们在创建实体视图日志的时候设定主键
SQL> create MATERIALIZED VIEW LOG ON xjzhang_table4 WITH PRIMARY KEY; 实体化视图日志已创建。

然后我们再次创建实体视图
SQL> create materialized view xjzhang_mat_view1 refresh fast on commit as select * from xjzhang_table4;
实体化视图已创建。

可以看出创建成功,如果需要自动更新的话,我们需要创建一个自动执行的 JOB。

分享到:
评论

相关推荐

    oracle9i实体化视图.

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

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

    在Oracle数据仓库环境中,可以通过两种不同的方法创建实体化视图:**立即构建**(BUILD IMMEDIATE) 和 **延迟构建**(BUILD DEFERRED)。前者在创建实体化视图时立即填充数据,而后者则先创建一个空的实体化视图,随后...

    常用的oracle表和视图

    ### 常用的Oracle表和视图知识点详解 #### 一、查询某个表在哪些存储过程中被使用 为了高效地了解某个特定表在哪些存储过程中被引用,可以...以上提供的视图和表可以帮助数据库管理员有效地管理和监控Oracle数据库。

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

    5. 复制环境的创建步骤:创建Oracle数据库复制环境通常遵循一系列明确的步骤,包括设置主体站点、创建主体组、配置主体表的冲突解决策略、设置实体化视图站点、创建部署模板、实例化程序包和实例化部署模板,以及...

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

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

    oracle视图详解

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

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

    这个"java根据数据库表或视图创建实体"的小工具,无疑是Java开发者的好帮手,尤其是在处理大量数据库表结构时,能够极大地提高开发速度和代码质量。同时,它也体现了Java编程中自动化和代码生成的思想,使得开发变得...

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

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

    ORACLE物化视图

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

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

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

    oracle实体类代码生成器

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

    Oracle 生成实体类.rar

    例如,Entity Framework是一个常用的ORM框架,它可以自动生成实体类和上下文类,但默认并不支持Oracle数据库,需要安装额外的提供者如Oracle Developer Tools for Visual Studio。 这个压缩包可能包含了一个自定义...

    SSH框架实现增删改查,Oracle数据库

    Oracle支持多种高级特性,如存储过程、触发器和分区等,可以提高数据处理的效率和安全性。 5. **CRUD操作**: - **Create**(创建):在添加数据时,我们首先需要在业务层(Service)创建一个新的实体对象,填充...

    物化视图的两种实现

    物化视图可以看作是虚拟视图的实体化版本,其内容是从一个或多个表中通过特定的SQL查询生成的。在实际应用中,物化视图通常用于数据仓库、报表生成以及需要快速访问聚合数据的场景。本篇将详细介绍物化视图的两种...

    oracle深入 chm oracle深入

    此外,物化视图和索引组织表(IOT)等高级特性可以优化特定查询性能。 "200866175448.chm"这个文件很可能包含了关于Oracle深入学习的详细资料,可能涵盖上述提到的各种主题。CHM文件是Microsoft的编译HTML帮助文件...

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

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

    oracle数据库同步

    主体站点和实体化视图站点在复制环境中扮演不同的角色,它们之间的通信对于数据同步至关重要。 ### 复制环境的类型 #### 多主体复制环境 多主体复制环境允许多个站点作为同级站点管理复制对象。每个站点都是主体...

    Oracle电子教案、Oracle课堂笔记.rar

    4. 视图和存储过程:视图用于提供定制化的数据视图,而存储过程则可以封装复杂的SQL逻辑,提高代码复用和安全性。 5. 数据完整性与安全性:涵盖实体完整性、参照完整性和用户定义的完整性,以及权限管理、角色、...

Global site tag (gtag.js) - Google Analytics