使用物化视图
授权物化视图权限.
grant create any masterialized view to scott;
创建物化视图
create materialized view mv
as select * from scott.emp;
物化视图的中的rowid和对应的表中的rowid不一致.
视图中的rowid和对应表中的rowid一致.
物化视图刷新类型:
全部(C)
exec dbms_mview.refresh('MV','C');
增量(F)
其实针对mv的信息至少一个update操作.
强制(?)
Never:
物化视图更新模式
手动
dbms_mview.refresh('MV',parallelism=>10);
多个
dbms_mview.refresh('MV1,MV2',parallelism=>10);
或者
dbms_mview.refresh_dependent('EMP');
备注:emp为mv的基表.
刷新所有的视图:
dbms_mview.refresh_all_mviews;
自动(同步或者异步)
通过oracle job实现自动刷新.
物化视图
在数据仓库系统中的使用.不同数据库中表的同步.
高级数据复制中使用.
查看PL中PL/SQL中package type和views;
实例如下:
使用实例证明实体化视图和视图的区别
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