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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值