我创建了一个实体视图,初始有200W数据,每天新增4W条数据
问题一:create materialized view VBZ_WPLYSTST
refresh fast on demand;报错为不能从复杂查询中创建一个可快速刷新的视图,请问何为复杂查询?ORACLE判断的依据是什么?
问题2:无奈之下只好创建为create materialized view VBZ_WPLYSTST
refresh complete on demand;请问当新增1条数据和1W条数据,刷新时间是一样的吗?如果不一样,差别是1和1W的差别还是很小的差别?如何提高视图的刷新效率?会不会因为基表数据越来越多,视图刷新一次的时间会越来越长?4W条数据的增量,200W的基数,刷新多长时间是合理的?
问题有点多,一旦解决200分双手奉上!望各位大虾不吝赐教!

解决方案 »

  1.   

    有没创建物化日志:
    在主数据库(待复制的数据)创建要进行数据复制的表的物化视图日值
    CREATE MATERIALIZED VIEW LOG ON tt  WITH ROWID, PRIMARY KEY, SEQUENCE  INCLUDING NEW VALUES;
      

  2.   

    没仔细看你的提问。给你个资料主备服务器做物化同步的,我之前提问过的。
    你在一台服务器上做。更简单些。你可以参照下。其中6楼的代码我都测试过的。
    http://topic.csdn.net/u/20080819/09/c4166aff-19f7-4dd0-ac4e-616543212789.html
      

  3.   

    因为视图不占有物理磁盘空间,一般只是在查询时才重新创建(刷新)一次的。
    可在程序中调用create or replace view,用户不调用时最好不要无故刷新,因为很耗资源。可参考一下:
    http://sourcecode.cangzhuo.com/Code/Oracle/View/Create-View.htm
      

  4.   

    差别是1和1W的差别还是很小的差别?如何提高视图的刷新效率?
    ==================================================
    给LZ一个连接地址,可防照(把表换成视图)下贴内容做有关view的各种测试,特别是在“步骤 1A(在 TEST_NORMAL 上)”http://www.oracle.com/technology/global/cn/pub/articles/sharma_indexes.html
      

  5.   

    >报错为不能从复杂查询中创建一个可快速刷新的视图,请问何为复杂查询?ORACLE判断的依据是什么? 看这篇文章你就知道从哪查失败的原因了:
    http://blog.itpub.net/post/468/13318
      

  6.   


    物化日志 下次更新就是采取增量更新(只更新基表中改变的数据)的方式。和oracle 增量备份(区别于海量备份)一个意思。
      

  7.   

    谢谢楼上各位朋友的指教~但是出现了这样一个问题:
    CREATE MATERIALIZED VIEW LOG ON t_wp_xh WITH ROWID, PRIMARY KEY, SEQUENCE  INCLUDING NEW VALUES;
    CREATE MATERIALIZED VIEW LOG ON t_wp_cx WITH ROWID, PRIMARY KEY, SEQUENCE  INCLUDING NEW VALUES;
    都成功了,然后
    CREATE MATERIALIZED VIEW  MVB_WP_CXXH REFRESH FAST ON DEMAND
    AS 
    select xtm,htm from T_WP_CX
    union all
    select xtm,htm from T_WP_XH
    报错,说ORACLE不能从一个复杂查询的中创建一个快速刷新的实体化视图,难到就只是用了个UNION ALL就算复杂查询了吗?
      

  8.   

    create materialized view MVB_WP_CXXH REFRESH FAST ON COMMIT
    AS
    select xtm,htm from T_WP_CX
    union all
    select xtm,htm from T_WP_XH 
      

  9.   

    接下来,我们通过使用DBMS_MVIEW.EXPLAIN_MVIEW过程来定位错误。
    使用EXPLAIN_MVIEW过程首先要建立MV_CAPABILITIES_TABLE表,建表的脚步是$ORACLE_HOME/rdbms/admin/utlxmv.sql。(EXPLAIN_MVIEW过程是两个过程的重载,一个输出到MV_CAPABILITIES_TABLE表,另一个以PL/SQL的VARRAY格式输出,为了简单起见,我们建立MV_CAPABILITIES_TABLE表)。
    SQL> @?rdbms/admin/utlxmv.sql
    表已创建。
    下面简单研究一下EXPLAIN_MVIEW过程。
    DBMS_MVIEW.EXPLAIN_MVIEW(mv IN VARCHAR2, Statement_id IN VARCHAR2:= NULL);
    该过程可以输入已经存在的物化视图名称(或USER_NAME.MV_NAME),也可输入建立物化视图的查询语句。另外一个参数STATEMENT_ID输入一个语句ID,为了标识出表中对应的记录。----------------------------------------------------以上摘自yangtingkun的blog----------------------
    你这个就是这样查:
    begin
    dbms_mview.explain_mview('MVB_WP_CXXH');
    end;
    SELECT CAPABILITY_NAME, RELATED_TEXT, MSGTXT
      FROM MV_CAPABILITIES_TABLE;
      

  10.   

    刚测试了下。是你REFRESH FAST ON DEMAND 的问题
    create materialized view MVB_WP_CXXH 
     AS select xtm,htm from T_WP_CX 
    union all select xtm,htm from T_WP_XH应该可以的。
    你在手工的设置刷新频率
      

  11.   

    经过测试,以下sql可以搞掂。 
    x列用于标识是哪个表,rid列是oracle要求取出rowid, 楼主可再试试 create materialized view mv_x 
    REFRESH FAST ON demand
    as 
    select 1 x, rowid rid, a from t_wp_xh 
    union all 
    select 2 x, rowid rid, a from t_wp_cx