`
longgangbai
  • 浏览: 7332422 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Oracle使用实例证明实体化视图和视图的区别

 
阅读更多
使用实例证明实体化视图和视图的区别
scott@TICKET> show user;
USER 为 "SCOTT"
scott@TICKET> create table t( key int primary key, val varchar(25));
create table t( key int primary key, val varchar(25))
             *
第 1 行出现错误:
ORA-00955: 名称已由现有对象使用


scott@TICKET> drop table t;

表已删除。
创建基础表
scott@TICKET> create table t( key int primary key, val varchar(25));

表已创建。
插入基础数据
scott@TICKET> insert into t  values(1,'a');

已创建 1 行。

scott@TICKET> insert into t  values(2,'b');

已创建 1 行。

scott@TICKET> insert into t  values(3,'c');

已创建 1 行。

scott@TICKET> commit;

提交完成。

scott@TICKET> select * from t;

       KEY VAL
---------- -------------------------
         1 a
         2 b
         3 c
创建视图和物化视图
scott@TICKET> create view v as select * from t;
create view v as select * from t
            *
第 1 行出现错误:
ORA-01031: 权限不足


scott@TICKET> conn / as sysdba
已连接。

GLOBAL_NAME
--------------------------------------------------------------------------------
sys@TICKET
给scott创建视图和物化视图的授权
sys@TICKET> grant create any view ,create any materialized view to scott;

授权成功。

sys@TICKET> conn scott/tiger
已连接。

GLOBAL_NAME
--------------------------------------------------------------------------------
scott@TICKET

scott@TICKET> create view v as select * from t;

视图已创建。

scott@TICKET> select * from v;

       KEY VAL
---------- -------------------------
         1 a
         2 b
         3 c

scott@TICKET> select rowid,a.* from t a;

ROWID                     KEY VAL
------------------ ---------- -------------------------
AAASzoAAEAAABHlAAA          1 a
AAASzoAAEAAABHlAAB          2 b
AAASzoAAEAAABHlAAC          3 c

scott@TICKET> select rowid,a.* from v a;

ROWID                     KEY VAL
------------------ ---------- -------------------------
AAASzoAAEAAABHlAAA          1 a
AAASzoAAEAAABHlAAB          2 b
AAASzoAAEAAABHlAAC          3 c

scott@TICKET> create materialized view mv  as
  2  select * from t;

实体化视图已创建。

scott@TICKET> select rowid,a.* from mv a;

ROWID                     KEY VAL
------------------ ---------- -------------------------
AAASzrAAEAAABH0AAA          1 a
AAASzrAAEAAABH0AAB          2 b
AAASzrAAEAAABH0AAC          3 c

由上面:
 查询t,v,mv的信息可以看出mv的rowid和其他的不一样.
 
scott@TICKET> update t set val='aa' where key=1;

已更新 1 行。

scott@TICKET> commit;

提交完成。

scott@TICKET> select * from t;

       KEY VAL
---------- -------------------------
         1 aa
         2 b
         3 c

scott@TICKET> select * from v;

       KEY VAL
---------- -------------------------
         1 aa
         2 b
         3 c

scott@TICKET> select * from mv;

       KEY VAL
---------- -------------------------
         1 a
         2 b
         3 c
由上面可以查看当基表t变化,t和v的查询结果相应的发生变化.但是mv的数据不变化.

scott@TICKET> host

scott@TICKET> conn /as sysdba
已连接。

GLOBAL_NAME
--------------------------------------------------------------------------------
sys@TICKET

sys@TICKET> conn scott/tiger
已连接。

GLOBAL_NAME
--------------------------------------------------------------------------------
scott@TICKET
刷新物化视图的信息
scott@TICKET> exec dbms_mview.refresh('MV');

PL/SQL 过程已成功完成。

scott@TICKET> select * from mv;

       KEY VAL
---------- -------------------------
         1 aa
         2 b
         3 c

scott@TICKET> update t set val='aa' where key=2;

已更新 1 行。

scott@TICKET> select * from t;

       KEY VAL
---------- -------------------------
         1 aa
         2 aa
         3 c

scott@TICKET> select * from v;

       KEY VAL
---------- -------------------------
         1 aa
         2 aa
         3 c
由上面可以看出mv刷新之后,mv,t,v的数据一致.

scott@TICKET> select * from mv;

       KEY VAL
---------- -------------------------
         1 aa
         2 b
         3 c


在创建物化视图的时候指定为快速更新视图
scott@TICKET> create materialized view mv_t refresh fast as select * from t;
create materialized view mv_t refresh fast as select * from t
                                                            *
第 1 行出现错误:
ORA-23413: 表 "SCOTT"."T" 不带实体化视图日志


scott@TICKET> create materialized view log on t;

实体化视图日志已创建。

scott@TICKET> create materialized view mv_t refresh fast as select * from t;

实体化视图已创建。

scott@TICKET> create materialized view mv_t2 refresh fast as select t.* from t;

实体化视图已创建。

由以上可以看出创建物化视图时候指定为快速更新视图必须先创建实体化视图日志,在创建实体化视图.


scott@TICKET> update t set val='abc' where key=3;

已更新 1 行。

scott@TICKET> commit;

提交完成。

scott@TICKET> select * from t;

       KEY VAL
---------- -------------------------
         1 aa
         2 aa
         3 abc

scott@TICKET> select * from v;

       KEY VAL
---------- -------------------------
         1 aa
         2 aa
         3 abc

scott@TICKET> select * from mv;

       KEY VAL
---------- -------------------------
         1 aa
         2 b
         3 c

scott@TICKET> select * from mv_t;

       KEY VAL
---------- -------------------------
         1 aa
         2 aa
         3 c

scott@TICKET> select * from mv_t2;

       KEY VAL
---------- -------------------------
         1 aa
         2 aa
         3 c

执行实体物化视图全部刷新
scott@TICKET> exec dbms_mview.refresh('MV','C');
PL/SQL 过程已成功完成。

执行实体物化视图快速刷新
scott@TICKET> exec dbms_mview.refresh('MV','F');
PL/SQL 过程已成功完成。


执行实体物化视图强制刷新
scott@TICKET> exec dbms_mview.refresh('MV','?');

PL/SQL 过程已成功完成。


查看物化视图的表信息
scott@TICKET> desc user_objects;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 OBJECT_NAME                                        VARCHAR2(128)
 SUBOBJECT_NAME                                     VARCHAR2(30)
 OBJECT_ID                                          NUMBER
 DATA_OBJECT_ID                                     NUMBER
 OBJECT_TYPE                                        VARCHAR2(19)
 CREATED                                            DATE
 LAST_DDL_TIME                                      DATE
 TIMESTAMP                                          VARCHAR2(19)
 STATUS                                             VARCHAR2(7)
 TEMPORARY                                          VARCHAR2(1)
 GENERATED                                          VARCHAR2(1)
 SECONDARY                                          VARCHAR2(1)
 NAMESPACE                                          NUMBER
 EDITION_NAME                                       VARCHAR2(30)

scott@TICKET> col object_name for a30;
scott@TICKET> col object_type for a20;
scott@TICKET> select object_name,object_type from user_objects;

OBJECT_NAME                    OBJECT_TYPE
------------------------------ --------------------
BONUS                          TABLE
SALGRADE                       TABLE
EMP_ENAME_IDX                  INDEX
EMP_JOB_IDX                    INDEX
SUPPLIER                       TABLE
EMP_TEMP                       TABLE
MLOG$_EMP                      TABLE
RUPD$_EMP                      TABLE
TEST                           TABLE
SALES_DELTA                    TABLE
DEPT                           TABLE
EMP                            TABLE
PK_EMP                         INDEX
PK_DEPT                        INDEX
TBS                            TABLE
SYS_C0015204                   INDEX
T                              TABLE
V                              VIEW
MV                             TABLE
SYS_C0015205                   INDEX
MV                             MATERIALIZED VIEW
MLOG$_T                        TABLE
RUPD$_T                        TABLE
MV_T                           TABLE
SYS_C0015206                   INDEX
MV_T                           MATERIALIZED VIEW
MV_T2                          TABLE
SYS_C0015207                   INDEX
MV_T2                          MATERIALIZED VIEW

已选择29行。
由以上信息可以看出
   1.在对象信息(MV_T,MV_T2,MV)可以看出物化视图均对应一个同名称的表.
由此可以解释为当t表更新时候,mv不更新的原因,mv实际是把基表对应的查询结果放在一个表中,查询mv
查询结果集的信息.每
   2.每一个实体化视图日志对应的对应的表如t创建实体化视图日志,对应的表为mlog$_t.
     命名规则为:mlog$_<TBS_NAME>

scott@TICKET> desc mlog$_t;
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 KEY                                                NUMBER(38)
 SNAPTIME$$                                         DATE
 DMLTYPE$$                                          VARCHAR2(1)
 OLD_NEW$$                                          VARCHAR2(1)
 CHANGE_VECTOR$$                                    RAW(255)

scott@TICKET> update t set val='aaab'  where key=1;

已更新 1 行。

scott@TICKET> select count(1) from mlog$_t;

  COUNT(1)
----------
         2

scott@TICKET> commit;

提交完成。

scott@TICKET> select count(1) from mlog$_t;

  COUNT(1)
----------
         2

scott@TICKET> select rowid,a.* from mv a;

ROWID                     KEY VAL
------------------ ---------- -------------------------
AAASzrAAEAAABH0AAA          1 aa
AAASzrAAEAAABH0AAB          2 aa
AAASzrAAEAAABH0AAC          3 abc

scott@TICKET> spool off;


参考官方网站:http://download.oracle.com/docs/cd/B10501_01/server.920/a96568/rarmviea.htm

 

分享到:
评论

相关推荐

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

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

    常用的oracle表和视图

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

    oracle+c#实例

    在C#中,我们可以使用ODP.NET(Oracle Data Provider for .NET)来连接和操作Oracle数据库。ODP.NET提供了ADO.NET接口,包括DataSet、DataTable、DataAdapter等对象,使得在C#中处理Oracle数据如同操作本地数据一样...

    ORACLE_DEVELOPER使用指南

    Oracle Developer是Oracle公司..."ORACLE_DEVELOPER使用指南"PDF文档将深入讲解这些方面,提供详细的步骤和实例,帮助你成为熟练的Oracle开发者。无论你是新手还是有经验的开发者,这个指南都将是你宝贵的参考资料。

    ORACLE 快照样例

    实体化视图-快照 自己调试的样例 供大家参考

    oracle开发使用手册

    8. **视图与物质化视图**:创建和使用视图,理解视图在数据库抽象和权限控制中的应用,以及物质化视图在数据缓存和数据同步中的作用。 9. **事务与并发控制**:理解事务的概念,掌握COMMIT、ROLLBACK、SAVEPOINT...

    Oracle数据库系统应用实例集锦与编程技巧

    文件100.001至100.010可能包含了上述各方面的实例和具体操作步骤,通过学习这些实例,读者可以更深入地理解Oracle数据库的使用和编程,解决实际工作中遇到的问题,提升数据库管理和开发的水平。无论是数据库管理员...

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

    2. Oracle体系结构:Oracle数据库的架构包括了数据库实例、数据库文件、控制文件、重做日志文件、参数文件等,这些元素如何协同工作来确保数据的持久性和一致性。 3. 表和索引:详细讲解如何创建、修改和删除表,...

    Oracle 9i高级复制技术及其应用.pdf

    在Oracle 9i中,快照的概念被实体化视图复制所取代,同时保留了多主体复制和新增了混合复制。 高级复制的核心概念包括: 1. **主体(Master)**:在复制环境中,主体是数据的原始源,负责产生和更新数据。当数据...

    ORACLE 8-8I开发使用手册

    6. **视图和物质化视图**:视图提供了一种抽象数据的方式,而物质化视图则可以预先计算并存储复杂查询的结果,以提高查询速度。 7. **安全性与权限**:Oracle 8-8i提供用户管理和权限控制机制,如GRANT和REVOKE命令...

    oracle 实例数据库

    Oracle实例数据库是一个复杂的系统,包含了各种组件和结构,用于存储、管理和处理数据。在这个特定的实例中,我们有一个专为新手设计的数据库,它包含了四张表,这为初学者提供了一个基础的学习平台,便于理解Oracle...

    Oracle 超强学习笔记

    通过"Oracle超强学习笔记"的深入学习,你将能够全面掌握Oracle数据库的使用和管理,无论你是初学者还是经验丰富的专业人士,都能从中受益匪浅。在实际操作中不断实践,逐步提升你的Oracle技术水平,成为一名优秀的...

    超详细ORACLE培训实例

    ### 超详细ORACLE培训实例知识点概览 #### 引言 - **SUN与Oracle合并背景**:2009年,Oracle宣布以74亿美元收购SUN,这一举措被视为Oracle进军云计算领域的关键步骤。SUN拥有强大的硬件基础和技术积累,特别是其在...

    Oracle_11gR2_概念 oracle白皮书 concept

    Oracle 11g R2的文档路线图(Oracle Database Documentation Roadmap)也为读者提供了更加系统的学习路径,旨在帮助读者更有效地查阅相关文档,从而深入理解和掌握Oracle数据库的使用和管理。 这份文档的最后还提供...

    ORACLE高级复制初级研究

    站点分为两种类型:主体站点(Master Sites)和实体化视图站点(Materialized View Sites)。 - **计划链接(Scheduled Links)**:一种数据库链接,用于按照预定的时间表将数据从一个站点同步到另一个站点。 - **主体...

    oracle+jsp数据库开发与实例

    本主题“Oracle + JSP数据库开发与实例”涵盖了这两个关键技术的整合使用,旨在帮助开发者掌握如何在实际项目中构建基于Oracle和JSP的数据驱动应用。 首先,Oracle数据库系统的使用涉及了SQL语言的学习,包括SELECT...

    传智播客 赵强 Oracle课件

    了解如何通过SQL*Plus和其他管理工具来管理和维护Oracle实例。 10. **实战项目**:通过赵强老师的课件,你将有机会参与到实际的项目中,将所学知识应用于解决实际问题,提高解决复杂数据库问题的能力。 赵强老师的...

Global site tag (gtag.js) - Google Analytics