• Oracle:物化视图的PCT特性(二)


    上一篇文章介绍了PCT的概念和优点,本文详细介绍一下PCT的限制。

    物化视图的PCT特性(一):http://blog.itpub.net/post/468/21406

    物化视图的分区变化跟踪特性(PCT)具有以下的限制条件:

    1.物化视图参考的基表中至少有一个是分区的;

    2.分区表必须是范围分区或复合分区;

    3.分区键必须由单列组成;

    4.物化视图必须包含基表的分区列或分区标志;

    5.如果物化视图包含GROUP BY语句,则分区列或分区标志必须出现在GROUP BY语句中;

    6.数据修改只能发生在分区表中;

    7.兼容性设置COMPATIBLE必须在9.0.0.0.0以上;

    8.物化视图不能参考远端表、视图或外连接;

    9.包含UNION ALL的物化视图不支持基于PCT的刷新。

    1.物化视图参考的基表中至少有一个是分区的;

    这一点是显而易见的,不过出于科学的态度,还是让事实来说话。

    SQL> create table t (id number, time date);

    表已创建。

    SQL> insert into t select rownum, sysdate - rownum from dba_objects;

    已创建6275行。

    SQL> commit;

    提交完成。

    SQL> create materialized view log on t with rowid, sequence (id, time)
    2 including new values;

    实体化视图日志已创建。

    SQL> create materialized view mv_t refresh fast enable query rewrite as
    2 select time, count(*) from t group by time;

    实体化视图已创建。

    SQL> exec dbms_mview.explain_mview('mv_t');

    PL/SQL 过程已成功完成。

    SQL> col related_text format a4
    SQL> col msgtxt format a50
    SQL> col capability_name format a16
    SQL> select capability_name, possible, related_text, msgtxt
    2 from mv_capabilities_table where capability_name like '%PCT%';

    CAPABILITY_NAME P RELA MSGTXT
    ---------------- - ---- ---------------------------------------------
    PCT N
    PCT_TABLE N T
    关系不是一个已分区的表
    REFRESH_FAST_PCT N PCT
    不可能在实体化视图中的任何从表上
    REWRITE_PCT N
    无法进行一般重写, 并且 PCT 不可能在任何从表上

    2.分区表必须是范围分区或复合分区;

    SQL> create table t1 (id number, time date)
    2 partition by hash (time)
    3 partitions 4;

    表已创建。

    SQL> insert into t1 select rownum, sysdate - rownum from dba_objects;

    已创建6284行。

    SQL> commit;

    提交完成。

    SQL> create materialized view log on t1 with rowid, sequence (id, time)
    2 including new values;

    实体化视图日志已创建。

    SQL> create materialized view mv_t1 refresh fast enable query rewrite as
    2 select time, count(*) from t1 group by time;

    实体化视图已创建。

    SQL> truncate table mv_capabilities_table;

    表已截掉。

    SQL> exec dbms_mview.explain_mview('mv_t1')

    PL/SQL 过程已成功完成。

    SQL> select capability_name, possible, related_text, msgtxt
    2 from mv_capabilities_table where capability_name like '%PCT%';

    CAPABILITY_NAME P RELA MSGTXT
    ---------------- - ---- ---------------------------------------------
    PCT N
    PCT_TABLE N T1 PCT
    不能与此类分区一起使用
    REFRESH_FAST_PCT N PCT
    不可能在实体化视图中的任何从表上
    REWRITE_PCT N
    无法进行一般重写, 并且 PCT 不可能在任何从表上

    PCT_TABLE对应的信息很明显,PCT不支持HASH分区,下面看看LIST分区的情况。

    SQL> create table t2 (id number, time date)
    2 partition by list (time)
    3 (partition p1 values (to_date('2004-1-1', 'yyyy-mm-dd')),
    4 partition p2 values (to_date('2005-1-1', 'yyyy-mm-dd')));

    表已创建。

    SQL> insert into t2 select rownum, trunc(sysdate - rownum/24, 'yyyy') from dba_objects;

    已创建6291行。

    SQL> commit;

    提交完成。

    SQL> create materialized view log on t2 with rowid, sequence (id, time)
    2 including new values;

    实体化视图日志已创建。

    SQL> create materialized view mv_t2 refresh fast enable query rewrite as
    2 select time, count(*) from t2 group by time;

    实体化视图已创建。

    SQL> truncate table mv_capabilities_table;

    表已截掉。

    SQL> exec dbms_mview.explain_mview('mv_t2')

    PL/SQL 过程已成功完成。

    SQL> select capability_name, possible, related_text, msgtxt
    2 from mv_capabilities_table where capability_name like '%PCT%';

    CAPABILITY_NAME P RELA MSGTXT
    ---------------- - ---- ---------------------------------------------
    PCT N
    PCT_TABLE N T2 PCT
    不能与此类分区一起使用
    REFRESH_FAST_PCT N PCT
    不可能在实体化视图中的任何从表上
    REWRITE_PCT N
    无法进行一般重写, 并且 PCT 不可能在任何从表上

    3.分区键必须由单列组成;

    SQL> create table t3 (id number, time date)
    2 partition by range (id, time)
    3 (partition p1 values less than (4000, to_date('2004-1-1', 'yyyy-mm-dd')),
    4 partition p2 values less than (4000, to_date('2005-1-1', 'yyyy-mm-dd')),
    5 partition p3 values less than (8000, to_date('2004-1-1', 'yyyy-mm-dd')),
    6 partition p4 values less than (8000, to_date('2005-1-1', 'yyyy-mm-dd'))
    7 )
    8 ;

    表已创建。

    SQL> insert into t3 select rownum, sysdate - rownum from dba_objects;

    已创建6281行。

    SQL> commit;

    提交完成。

    SQL> create materialized view log on t3 with rowid, sequence (id, time)
    2 including new values;

    实体化视图日志已创建。

    SQL> create materialized view mv_t3 refresh fast enable query rewrite as
    2 select id, time, count(*) from t3 group by id, time;

    实体化视图已创建。

    SQL> truncate table mv_capabilities_table;

    表已截掉。

    SQL> exec dbms_mview.explain_mview('mv_t3')

    PL/SQL 过程已成功完成。

    SQL> select capability_name, possible, related_text, msgtxt
    2 from mv_capabilities_table where capability_name like '%PCT%';

    CAPABILITY_NAME P RELA MSGTXT
    ---------------- - ---- ---------------------------------------------
    PCT N
    PCT_TABLE N T3 PCT
    不能与多栏分区关键字一起使用
    REFRESH_FAST_PCT N PCT
    不可能在实体化视图中的任何从表上
    REWRITE_PCT N
    无法进行一般重写, 并且 PCT 不可能在任何从表上

    4.物化视图必须包含基表的分区列或分区标志;

    这点也很容易理解,如果物化视图不包含分区列或分区标志,则Oracle无法知道一条记录会受哪个分区的影响。

    SQL> create table t4 (id number, time date)
    2 partition by range (time)
    3 (partition p1 values less than (to_date('2004-1-1', 'yyyy-mm-dd')),
    4 partition p2 values less than (to_date('2005-1-1', 'yyyy-mm-dd')),
    5 partition p3 values less than (to_date('2006-1-1', 'yyyy-mm-dd')))
    6 ;

    表已创建。

    SQL> insert into t4 select rownum, sysdate - rownum from dba_objects;

    已创建6287行。

    SQL> commit;

    提交完成。

    SQL> create materialized view log on t4 with rowid, sequence (id, time)
    2 including new values;

    实体化视图日志已创建。

    SQL> create materialized view mv_t4 refresh fast enable query rewrite as
    2 select id, count(*) from t4 group by id;

    实体化视图已创建。

    SQL> truncate table mv_capabilities_table;

    表已截掉。

    SQL> exec dbms_mview.explain_mview('mv_t4')

    PL/SQL 过程已成功完成。

    SQL> select capability_name, possible, related_text, msgtxt
    2 from mv_capabilities_table where capability_name like '%PCT%';

    CAPABILITY_NAME P RELA MSGTXT
    ---------------- - ---- --------------------------------------------
    PCT N
    PCT_TABLE N T4
    在选择列表中缺少分区关键字或 PMARKER
    REFRESH_FAST_PCT N PCT
    不可能在实体化视图中的任何从表上

    REWRITE_PCT N
    无法进行一般重写, 并且 PCT 不可能在任何从表上

    5.如果物化视图包含GROUP BY语句,则分区列或分区标志必须出现在GROUP BY语句中;

    这个条件和上面的类似。

    SQL> create materialized view mv_t4 refresh fast enable query rewrite as
    2 select id, count(time) from t4 group by id;

    实体化视图已创建。

    SQL> truncate table mv_capabilities_table;

    表已截掉。

    SQL> exec dbms_mview.explain_mview('mv_t4')

    PL/SQL 过程已成功完成。

    SQL> select capability_name, possible, related_text, msgtxt
    2 from mv_capabilities_table where capability_name like '%PCT%';

    CAPABILITY_NAME P RELA MSGTXT
    ---------------- - ---- --------------------------------------------
    PCT N
    PCT_TABLE N T4
    在选择列表中缺少分区关键字或 PMARKER
    REFRESH_FAST_PCT N PCT
    不可能在实体化视图中的任何从表上

    REWRITE_PCT N
    无法进行一般重写, 并且 PCT 不可能在任何从表上

    6.数据修改只能发生在分区表中;

    SQL> create table t5 (id number, name varchar2(30));

    表已创建。

    SQL> insert into t5 select rownum, object_name from dba_objects;

    已创建6292行。

    SQL> commit;

    提交完成。

    SQL> create materialized view log on t5 with rowid;

    实体化视图日志已创建。

    SQL> create materialized view mv_t5 refresh fast enable query rewrite as
    2 select a.rowid a_rid, b.rowid b_rid, a.id, a.name, b.time from t5 a, t4 b
    3 where a.id = b.id;

    实体化视图已创建。

    SQL> truncate table mv_capabilities_table;

    表已截掉。

    SQL> exec dbms_mview.explain_mview('mv_t5')

    PL/SQL 过程已成功完成。

    SQL> select capability_name, possible, related_text, msgtxt
    2 from mv_capabilities_table where capability_name like '%PCT%';

    CAPABILITY_NAME P RELA MSGTXT
    ---------------- - ---- --------------------------------------
    PCT Y
    PCT_TABLE N T5
    关系不是一个已分区的表
    PCT_TABLE Y T4
    REFRESH_FAST_PCT Y
    REWRITE_PCT Y

    由于T4是分区表,且满足其他PCT的条件,因此T4是支持PCT的,而T5不是分区表,因此对T5修改将会导致整个物化视图变为STALE状态。

    SQL> set autot on exp
    SQL> select time, name from t4, t5
    2 where t4.id = t5.id
    3 and time > to_date('2005-1-1', 'yyyy-mm-dd')
    4 and time < to_date('2005-1-3', 'yyyy-mm-dd');

    TIME NAME
    ---------- ------------------------------
    02-1
    -05 ALL_MVIEW_AGGREGATES
    01-1
    -05 ALL_MVIEW_ANALYSIS


    Execution Plan
    ----------------------------------------------------------
    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=7 Card=11 Bytes=286)
    1 0 TABLE ACCESS (FULL) OF 'MV_T5' (Cost=7 Card=11 Bytes=286)

    SQL> delete t4 where time < to_date('2003-12-1', 'yyyy-mm-dd');

    已删除5819行。


    Execution Plan
    ----------------------------------------------------------
    0 DELETE STATEMENT Optimizer=CHOOSE (Cost=4 Card=82 Bytes=738)
    1 0 DELETE OF 'T4'
    2 1 TABLE ACCESS (FULL) OF 'T4' (Cost=4 Card=82 Bytes=738)

    SQL> commit;

    提交完成。

    SQL> select time, name from t4, t5
    2 where t4.id = t5.id
    3 and time > to_date('2005-1-1', 'yyyy-mm-dd')
    4 and time < to_date('2005-1-3', 'yyyy-mm-dd');

    TIME NAME
    ---------- ------------------------------
    02-1
    -05 ALL_MVIEW_AGGREGATES
    01-1
    -05 ALL_MVIEW_ANALYSIS


    Execution Plan
    ----------------------------------------------------------
    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=7 Card=11 Bytes=286)
    1 0 TABLE ACCESS (FULL) OF 'MV_T5' (Cost=7 Card=11 Bytes=286)

    SQL> delete t5 where id = 1;

    已删除 1 行。


    Execution Plan
    ----------------------------------------------------------
    0 DELETE STATEMENT Optimizer=CHOOSE
    1 0 DELETE OF 'T5'
    2 1 TABLE ACCESS (FULL) OF 'T5'

    SQL> commit;

    提交完成。

    SQL> select time, name from t4, t5
    2 where t4.id = t5.id
    3 and time > to_date('2005-1-1', 'yyyy-mm-dd')
    4 and time < to_date('2005-1-3', 'yyyy-mm-dd');

    TIME NAME
    ---------- ------------------------------
    02-1
    -05 ALL_MVIEW_AGGREGATES
    01-1
    -05 ALL_MVIEW_ANALYSIS


    Execution Plan
    ----------------------------------------------------------
    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=7 Card=6 Bytes=312)
    1 0 HASH JOIN (Cost=7 Card=6 Bytes=312)
    2 1 TABLE ACCESS (FULL) OF 'T4' (Cost=2 Card=1 Bytes=22)
    3 1 TABLE ACCESS (FULL) OF 'T5' (Cost=4 Card=2288 Bytes=68640)

    7.兼容性设置COMPATIBLE必须在9.0.0.0.0以上;

    PCT特性是9i的新特性,9i以下的版本不支持。由于没有8i的环境,没有测试,不过,在上一篇文章的回复中,玉面飞龙做了8174的测试,确认了8i是不支持PCT功能的。

    8.物化视图不能参考远端表、视图或外连接;

    SQL> alter table t5 add primary key (id);

    表已更改。

    SQL> create materialized view mv_t6 refresh fast enable query rewrite as
    2 select a.rowid a_rid, b.rowid b_rid, a.id, a.name, b.time from t5 a, t4 b
    3 where a.id(+) = b.id;

    实体化视图已创建。

    SQL> truncate table mv_capabilities_table;

    表已截掉。

    SQL> exec dbms_mview.explain_mview('mv_t6')

    PL/SQL 过程已成功完成。

    SQL> select capability_name, possible, related_text, msgtxt
    2 from mv_capabilities_table where capability_name like '%PCT%';

    CAPABILITY_NAME P RELA MSGTXT
    ---------------- - ---- -------------------------------------------
    PCT Y
    PCT_TABLE N T5
    关系不是一个已分区的表
    PCT_TABLE Y T4
    REFRESH_FAST_PCT Y
    REWRITE_PCT Y

    SQL> alter table t4 add primary key (id);

    表已更改。

    SQL> create materialized view mv_t7 refresh fast enable query rewrite as
    2 select a.rowid a_rid, b.rowid b_rid, a.id, a.name, b.time from t5 a, t4 b
    3 where a.id = b.id(+);

    实体化视图已创建。

    SQL> truncate table mv_capabilities_table;

    表已截掉。

    SQL> exec dbms_mview.explain_mview('mv_t7')

    PL/SQL 过程已成功完成。

    SQL> select capability_name, possible, related_text, msgtxt
    2 from mv_capabilities_table where capability_name like '%PCT%';

    CAPABILITY_NAME P RELA MSGTXT
    ---------------- - ---- ------------------------------------------
    PCT Y
    PCT_TABLE N T5
    关系不是一个已分区的表
    PCT_TABLE Y T4
    REFRESH_FAST_PCT Y
    REWRITE_PCT Y

    从上面的测试,没有发现Oracle给出任何错误提示,不过通过测试可以发现,Oracle确实不再支持PCT属性了。

    SQL> set autot on exp
    SQL> select time, name from t4, t5
    2 where t4.id (+) = t5.id
    3 and time > to_date('2005-1-1', 'yyyy-mm-dd')
    4 and time < to_date('2005-1-3', 'yyyy-mm-dd');

    TIME NAME
    ---------- ------------------------------
    02-1
    -05 ALL_MVIEW_ANALYSIS
    01-1
    -05 ALL_MVIEW_DETAIL_RELATIONS


    Execution Plan
    ----------------------------------------------------------
    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=6 Bytes=312)
    1 0 NESTED LOOPS (Cost=3 Card=6 Bytes=312)
    2 1 TABLE ACCESS (FULL) OF 'T4' (Cost=2 Card=1 Bytes=22)
    3 1 TABLE ACCESS (BY INDEX ROWID) OF 'T5' (Cost=1 Card=6 Bytes=180)
    4 3 INDEX (UNIQUE SCAN) OF 'SYS_C001959' (UNIQUE)

    SQL> select time, name from t4, t5
    2 where t4.id = t5.id (+)
    3 and time > to_date('2005-1-1', 'yyyy-mm-dd')
    4 and time < to_date('2005-1-3', 'yyyy-mm-dd');

    TIME NAME
    ---------- ------------------------------
    02-1
    -05 ALL_MVIEW_ANALYSIS
    01-1
    -05 ALL_MVIEW_DETAIL_RELATIONS


    Execution Plan
    ----------------------------------------------------------
    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=6 Bytes=312)
    1 0 NESTED LOOPS (OUTER) (Cost=3 Card=6 Bytes=312)
    2 1 TABLE ACCESS (FULL) OF 'T4' (Cost=2 Card=1 Bytes=22)
    3 1 TABLE ACCESS (BY INDEX ROWID) OF 'T5' (Cost=1 Card=6 Bytes=180)
    4 3 INDEX (UNIQUE SCAN) OF 'SYS_C001959' (UNIQUE)

    由于增加了两个主键,Oracle认为现在直接通过基表进行外连接比全表扫描物化视图的代价要小,因此没有选择使用查询重新功能。下面通过HINTREWRITE来强制使用查询重写功能。

    SQL> select /*+ rewrite(mv_t6) */ time, name from t4, t5
    2 where t4.id = t5.id (+)
    3 and time > to_date('2005-1-1', 'yyyy-mm-dd')
    4 and time < to_date('2005-1-3', 'yyyy-mm-dd');

    TIME NAME
    ---------- ------------------------------
    02-1
    -05 ALL_MVIEW_ANALYSIS
    01-1
    -05 ALL_MVIEW_DETAIL_RELATIONS


    Execution Plan
    ----------------------------------------------------------
    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=7 Card=11 Bytes=286)
    1 0 TABLE ACCESS (FULL) OF 'MV_T6' (Cost=7 Card=11 Bytes=286)

    SQL> select /*+ rewrite(mv_t7) */ time, name from t4, t5
    2 where t4.id (+) = t5.id
    3 and time > to_date('2005-1-1', 'yyyy-mm-dd')
    4 and time < to_date('2005-1-3', 'yyyy-mm-dd');

    TIME NAME
    ---------- ------------------------------
    02-1
    -05 ALL_MVIEW_ANALYSIS
    01-1
    -05 ALL_MVIEW_DETAIL_RELATIONS


    Execution Plan
    ----------------------------------------------------------
    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=7 Card=11 Bytes=286)
    1 0 TABLE ACCESS (FULL) OF 'MV_T7' (Cost=7 Card=11 Bytes=286)

    SQL> alter table t4 truncate partition p1;

    表已截掉。

    SQL> select /*+ rewrite(mv_t6) */ time, name from t4, t5
    2 where t4.id = t5.id (+)
    3 and time > to_date('2005-1-1', 'yyyy-mm-dd')
    4 and time < to_date('2005-1-3', 'yyyy-mm-dd');

    TIME NAME
    ---------- ------------------------------
    02-1
    -05 ALL_MVIEW_ANALYSIS
    01-1
    -05 ALL_MVIEW_DETAIL_RELATIONS


    Execution Plan
    ----------------------------------------------------------
    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=6 Bytes=312)
    1 0 NESTED LOOPS (OUTER) (Cost=3 Card=6 Bytes=312)
    2 1 TABLE ACCESS (FULL) OF 'T4' (Cost=2 Card=1 Bytes=22)
    3 1 TABLE ACCESS (BY INDEX ROWID) OF 'T5' (Cost=1 Card=6 Bytes=180)
    4 3 INDEX (UNIQUE SCAN) OF 'SYS_C001959' (UNIQUE)

    SQL> select /*+ rewrite(mv_t7) */ time, name from t4, t5
    2 where t4.id (+) = t5.id
    3 and time > to_date('2005-1-1', 'yyyy-mm-dd')
    4 and time < to_date('2005-1-3', 'yyyy-mm-dd');

    TIME NAME
    ---------- ------------------------------
    02-1
    -05 ALL_MVIEW_ANALYSIS
    01-1
    -05 ALL_MVIEW_DETAIL_RELATIONS


    Execution Plan
    ----------------------------------------------------------
    0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=6 Bytes=312)
    1 0 NESTED LOOPS (Cost=3 Card=6 Bytes=312)
    2 1 TABLE ACCESS (FULL) OF 'T4' (Cost=2 Card=1 Bytes=22)
    3 1 TABLE ACCESS (BY INDEX ROWID) OF 'T5' (Cost=1 Card=6 Bytes=180)
    4 3 INDEX (UNIQUE SCAN) OF 'SYS_C001959' (UNIQUE)

    可以看到,即使指定了REWRITE,发生分区修改后,PCT功能已经消失,而这正是外关联带来的后果。

    SQL> conn yangtk/yangtk@yangtk已连接。
    SQL> create table t (id number, time date)
    2 partition by range (time)
    3 (partition p1 values less than (to_date('2004-1-1', 'yyyy-mm-dd')),
    4 partition p2 values less than (to_date('2005-1-1', 'yyyy-mm-dd')),
    5 partition p3 values less than (to_date('2006-1-1', 'yyyy-mm-dd')))
    6 ;

    表已创建。

    SQL> insert into t select rownum, sysdate - rownum from dba_objects;

    已创建32259行。

    SQL> commit;

    提交完成。

    SQL> create materialized view log on t with rowid, sequence (id, time)
    2 including new values;

    实体化视图日志已创建。

    SQL> conn yangtk/yangtk@test4已连接。
    SQL> create materialized view mv_t_remote refresh fast enable query rewrite as
    2 select time, count(*) from t@yangtk group by time;

    实体化视图已创建。

    SQL> truncate table mv_capabilities_table;

    表已截掉。

    SQL> exec dbms_mview.explain_mview('mv_t_remote')

    PL/SQL 过程已成功完成。

    SQL> select capability_name, possible, related_text, msgtxt
    2 from mv_capabilities_table where capability_name like '%PCT%';

    CAPABILITY_NAME P RELA MSGTXT
    ---------------- - ---- -------------------------------------------
    PCT N
    PCT_TABLE N T
    关系不是一个已分区的表
    REFRESH_FAST_PCT N PCT
    不可能在实体化视图中的任何从表上
    REWRITE_PCT N
    无法进行一般重写, 并且 PCT 不可能在任何从表上

    SQL> select count(*) from mv_t_remote;

    COUNT(*)
    ----------
    32259

    Oracle无法了解远处表的详细情况,因此不认为远端表是分区表。

    SQL> create view v_t5 as
    2 select a.rowid a_rid, b.rowid b_rid, a.id, a.name, b.time from t5 a, t4 b
    3 where a.id = b.id;

    视图已建立。

    SQL> create materialized view mv_v_t5 as select * from v_t5;

    实体化视图已创建。

    SQL> truncate table mv_capabilities_table;

    表已截掉。

    SQL> exec dbms_mview.explain_mview('mv_v_t5')

    PL/SQL 过程已成功完成。

    SQL> select capability_name, possible, related_text, msgtxt
    2 from mv_capabilities_table where capability_name like '%PCT%';

    CAPABILITY_NAME P RELA MSGTXT
    ---------------- - ---- --------------------------------------------
    PCT N
    PCT_TABLE N V_T5
    关系不是一个已分区的表
    REFRESH_FAST_PCT N PCT
    不可能在实体化视图中的任何从表上
    REWRITE_PCT N
    无法进行一般重写, 并且 PCT 不可能在任何从表上

    通过视图建立的物化视图不再支持PCT

    9.包含UNION ALL的物化视图不支持基于PCT的刷新。

    SQL> create table t8 (id number, time date, num1 number, num2 number)
    2 partition by range (time)
    3 (partition p1 values less than (to_date('2004-1-1', 'yyyy-mm-dd')),
    4 partition p2 values less than (to_date('2005-1-1', 'yyyy-mm-dd')),
    5 partition p3 values less than (to_date('2006-1-1', 'yyyy-mm-dd')))
    6 ;

    表已创建。

    SQL> insert into t8 select rownum, sysdate - rownum,
    2 rownum * 2, rownum * 3 from dba_objects;

    已创建6298行。

    SQL> commit;

    提交完成。

    SQL> create materialized view log on t8 with rowid, sequence (time, num1, num2)
    2 including new values;

    实体化视图日志已创建。

    SQL> create materialized view mv_t8 refresh fast enable query rewrite as
    2 select 1 flag, time, count(*) cnt, count(num1) num_cnt, sum(num1) total
    3 from t8 group by time
    4 union all
    5 select 2 flag, time, count(*) cnt, count(num2) num_cnt, sum(num2) total
    6 from t8 group by time;

    实体化视图已创建。

    SQL> truncate table mv_capabilities_table;

    表已截掉。

    SQL> exec dbms_mview.explain_mview('mv_t8')

    PL/SQL 过程已成功完成。

    SQL> select capability_name, possible, related_text, msgtxt
    2 from mv_capabilities_table where capability_name like '%PCT%';

    CAPABILITY_NAME P RELA MSGTXT
    ---------------- - ---- --------------------------------------------
    PCT Y
    PCT_TABLE Y T8
    PCT_TABLE N T8
    在选择列表中缺少分区关键字或 PMARKER
    REFRESH_FAST_PCT Y
    REWRITE_PCT N
    无法进行一般重写, 并且 PCT 不可能在任何从表上

    SQL> alter table t8 drop partition p1;

    表已更改。

    SQL> exec dbms_mview.refresh('mv_t8');
    BEGIN dbms_mview.refresh('mv_t8'); END;

    *
    ERROR
    位于第 1 :
    ORA-32313: PMOP
    之后不支持 "YANGTK"."MV_T8"
    REFRESH FAST
    ORA-06512:
    "SYS.DBMS_SNAPSHOT", line 794
    ORA-06512:
    "SYS.DBMS_SNAPSHOT", line 851
    ORA-06512:
    "SYS.DBMS_SNAPSHOT", line 832
    ORA-06512:
    line 1

    虽然EXPLAIN_MVIEW给出的解释是支持REFRESH_FAST_PCT的,但是通过测试,发现和文档上描述的一致,包含UNION ALL的物化视图不支持基于PCT的快速刷新。

    查询OracleORA-32313错误信息:

    ORA-32313 REFRESH FAST of "string"."string" unsupported after PMOPs

    Cause: A Partition Maintenance Operation (PMOP) has been performed on a detail table, and the specified materialized view does not support fast refersh after PMOPs.

    Action: Use REFRESH COMPLETE. You can determine why your materialized view does not support fast refresh after PMOPs using the DBMS_MVIEW.EXPLAIN_MVIEW() API.

    对于EXPLAIN_MVIEW的解释大部分没有问题,但是对于基于外连接的物化视图和包含UNION ALL的物化视图,EXPLAIN_MVIEW的结果有些问题,在使用的时候需要留心。

    魔兽就是毒瘤,大家千万不要玩。
  • 相关阅读:
    MyBatis入门基础
    复制复杂链表
    二叉树中和为某一值的所有路径
    树的层次遍历
    Statement, PreparedStatement和CallableStatement的区别
    JSP有哪些动作?
    latex 输入矩阵
    Struts简单入门实例
    在Eclipse里面配置Struts2
    Windows使用Github
  • 原文地址:https://www.cnblogs.com/tracy/p/2150659.html
Copyright © 2020-2023  润新知