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

Oracle 性能调优学习笔记(十六)--- 使用物化视图

 
阅读更多

 


使用物化视图
       授权物化视图权限.
       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

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics