IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]物化视图刷新原理与性能诊断

    changyanmanman发表于 2015-08-12 14:21:49
    love 0

    参考文档:Materialized View Refresh: Locking, Performance, Monitoring (文档 ID 258252.1)

    How to Monitor the Progress of a Materialized View Refresh (MVIEW) (文档 ID 258021.1)

    1、名词解释:
    基表
    指的是英文里面的Master Table和Master Materialized View,并不只是只一个表,而是创建MView的时候所需要用到的n个表或者是相关的上一级的MView。
    MView
    就是Materialized View了,物化视图。
    源数据库端
    Master Site和Master Materialized View Site,指的是基表所在的数据库
    MView端
    Materialized View Site,MView所在的数据库

    2、常见用法:

    例子:

    SQL>create materialized view log on table_tst;

    SQL>create materialized view table_tst [on prebuilt table]  refresh   fast as select * from table_tst@lnk_db_master; 

    SQL>exec dbms_mview.refresh('table_tst',method => 'Complete');

    SQL>exec dbms_mview.refresh('table_tst'); 

    SQL> declare jobid number;

    begin

    sys.dbms_job.submit(job => jobid,

    what => 'dbms_mview.refresh(''table_tst'');',

    next_date => sysdate,

    interval => 'sysdate+5/1440');

    commit;

    end;

     /

    其中

    第1步是在需要复制的主表(master table)上创建mv log。

    第2步是在远程站点(想复制到的那个站点)上创建mv,注意,如果选择了选项on prebuild table的话,表示在已经存在的表上创建mv,需要已经存在的表的字段与select的字段必须要对应,这个已经存在的表中可以没有数据。

    第3步是全同步,如果没有选择on prebuild table,这一步可以省略,因为默认创建mv的时候,就会全刷新

    第4步是增量刷新,在完成全刷新以后的情况下,一般都只需要做增量刷新即可。

    第5步是创建一个自动刷新的作业来进行刷新,如每5分钟刷新一次,这个操作也可以同crontab来代替。


    我们举个测试栗子:

    创建带有主键的表(不能用sys用户,因为sys用户的表不能创建mv 日志):ORA-12010: 不能在 SYS 拥有的表上创建实体化视图日志。
    create table table_tst (a int, b varchar2(50), constraint pk_tst primary key(a));
     
    创建对应的MV名为
    create materialized view table_tst_mv as select * from table_tst;

    此时表SYS.SNAP$中多了一条新记录:



    创建视图日志:
    create materialized view log on table_tst;
    此时表sys.MLOG$中多了一条新记录:



    向表中插入数据:
    insert into table_tst select rownum, object_name from all_objects;


    检查当前表和物化视图里的数据是否一致:
    select count(*) from table_tst
     COUNT(*)
    ----------
         85722


    select count(*) from table_tst_mv
      COUNT(*)
    ----------
    0

    刷新到物化视图:
    exec dbms_mview.refresh('table_tst_mv');

    SQL> select count(*) from table_tst_mv;

      COUNT(*)
    ----------
          85722


    此时物化视图已经刷新了,在看下记录表(已经记录了现在youngest的时间,最新时间):



    同事sys.SNAP$ 里面也记录了最新RSCN:





    在实际应用的环境中表T和MView MVT并不是在同一个机器上,而是分散在两个以上的机器上,同时基表也可能不止一个,可能存在多个。

    下面列举了MView在实际中的主要作用:

    • 减轻网络负担:通过MV将数据从一个数据库分发到多个不同的数据库上,通过对多个数据库访问来减轻对单个数据库的网络负担。
    • 搭建分发环境:通过从一个中央数据库将数据分发到多个节点数据库,达到分发数据的目的。
    • 复制数据子集:MV可以进行行级/列级的筛选,这样可以复制需要的那一部分数据。
    • 支持离线计算:MV不需要专用的数据库连接,用户可以按照自己的需求来复制所需要的那一部分数据。


    3、物化视图相关的重要的表:

    dba_mviews记录了远程站点上mv的数目与属性,需要在创建MV的站点上查询。

    sys.mlog$ 则记录了主站点上的mv的log数目,如果一个master对应到多个站点,也只有一条记录,对应到dba_mview_logs视图,需要在主站点查询。

    sys.slog$记录了主站点上已经注册成功的主表信息,如果一个主表被复制到多个站点,则对应多条记录,在主站点查询。

    dba_snapshot_logs存放了mv的log日志,如果对应到多个站点,则每个站点都对应一条记录,因为远程站点的snapshot_id是不一样的。其实sys.mlog$与sys.slog$的关联就是组成dba_snapshot_logs的一个部分,通过查询dba_views可以看到其脚本。

    dba_registered_snapshots记录了远程站点的注册信息,只记录注册成功的远程站点,通过snapshot_id可以与dba_snapshot_logs关联。




    4、工作原理:

    3.1、当一个物化视图刷新的时候,会发生如下事件:

    1)SYS.SNAP$ and SYS.MLOG$ are updated to show the time of refresh.

    2)If a complete refresh on only one mview is performed using the DBMS_MVIEW.REFRESH() API rows in the mview base table are deleted by default. If the parameter atomic_refresh is passed as false(the default is true) the mview base table is truncated.

    If the refresh is fast, or involves multiple mviews, or is being performed on a refresh group, rows in the mview base table(s) are deleted.

    3) All rows selected from the master table are inserted into the snapshot base table.

    4) SYS.SLOG$ is updated with the time of refresh. In the case of a fast refresh, an additional step is performed:

    5) Rows which are no longer needed for a refresh by any mview are deleted from the mview log -schema.MLOG$_table.

    Note: For more information on refresh steps, please see NOTE:258021.1
    How to monitor the progress of a materialized view refresh

    The Oracle read consistent mechanism is used to select a consistent set of rows from the MASTER table, therefore it is NOT necessary to take out any locks against the MASTER table.




















沪ICP备19023445号-2号
友情链接