暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

“ 物化视图是个什么玩意儿?”

362

普通视图

视图可以理解为一张表或多张表的预计算,这些表称为基表
它可以将所需要查询的结果封装成一张虚拟表,基于它创建时指定的查询语句返回的结果集。
视图具有以下特点:


安全性:只将需要的结果呈现出来,查询者不知道具体用了哪些表或哪些字段,因此比较安全;
屏蔽复杂性:下层计算可能做了很多复杂的关联操作,只需要让开发者将其实现,将结果以视图呈现给使用者。


如何创建普通视图

    CREATE [OR REPLACE] VIEW view
    [(alias[, alias]...)]
    AS subquery
    [WITH READ ONLY];
    例如:
      create view v_emp as select * from emp where deptno = 30;

      物化视图

      对于普通视图而言,其真实数据在基表中,即每次查询视图都是需要执行查询语句。
      有时候为了防止每次都查询,将结果集存储起来,这种有真实数据的视图,称为物化视图。
      什么情况下适合用物化视图?
      基表没有很多 DML,且每次查询都需要耗费较大资源的情况下,可以考虑用物化视图。
      物化视图的创建是这样的:
        CREATE METERIALIZED VIEW view_name
        [BUILD IMMEDIATE | BUILD DEFERRED ]①
        REFRESH [FAST|COMPLETE|FORCE]②
        [ON [COMMIT |DEMAND ] | START WITH (start_time) NEXT(next_time)]③
        AS subquery
        ① BUILD IMMEDIATE 创建物化视图的时候就生成数据,是默认方式;
        BUILD DEFERRED 创建时不生成数据,以后根据需要再生成。理解为创建一个空的视图。
        ② REFRESH:当基表发生 DML 操作后,物化视图何时采用哪种方式和基表同步数据。
        REFRESH 后面跟着的刷新方法有:FAST、COMPLETE、FORCE。


        FAST:增量刷新,只刷新自上次刷新以后进行的修改。
        COMPLETE:对整个物化视图进行完全的刷新,相当于先 truncate 再 insert。
        FORCE:默认的刷新方式。刷新时会去判断是否可以进行快速刷新,如果可以则采用 FAST 方式,否则采用 COMPLETE 的方式。


        ③ 刷新的模式有两种:ON DEMAND 和 ON COMMIT。默认为 ON DEMAND


        ON DEMAND 需要手动刷新物化视图。
        ON COMMIT 在基表发生 COMMIT 操作时刷新。


        增量刷新如何判断哪些记录被改动?

        通过对基表建立物化视图日志,就可以监测到基表的变动。
        每当基表有变动的时候就会往对应的物化视图日志中写入数据。
        当进行 Fast 刷新的时候,物化视图日志中的改动就会写入到物化视图中,这样就实现了增量刷新。

        物化视图创建案例

          create materialized view my_materialized
          refresh complete
          on demand start with sysdate next
          to_date(concat(to_char(sysdate + 1,'dd-mm-yyyy'),'00:03:00'),'dd-mm-yyyy hh24:mi:ss')
          as select * from user_info;
          这个物化视图表示从当前日期开始,往后每天 00:03 进行全量覆盖刷新。

          如果觉得对你有帮助,或者觉得还行的话,麻烦动动小手点个小赞点个在看。

          文章转载自大数据的奇妙冒险,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论