实体化视图 oracle,Oracle运用实例证明实体化视图和视图的区别

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$_

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、付费专栏及课程。

余额充值