2011-10-13 110 views
1

快速刷新提交联合所有实例化视图(在Oracle中)是否复制所有底层数据,还是只有一个引用它?“union all”物化视图是否占用空间?

如果物化视图不复制所有数据是反正有做到以下几点:

create table3 as (table1 union all table2); 

所以,我可以创建索引和表3物化视图日志,和表3中仅仅是表的引用1和表2

的原因是我想放在一个物化视图如下:

create materialized view mat1 
refresh fast on commit 
(
    select data, count(*) 
    from (table1 union all table2) 
    group by data 
); 

但上面没有快速刷新。

但以下诸如此类的事情,工作原理:

create materialized view mat1 
refresh fast on commit 
(
    select data from table1 
    union all 
    select data from table2 
); 

create materialized view mat2 
refresh fast on commit 
(
    select data, count(*) 
    from mat2 
    group by data 
); 

但我担心的第一个物化视图不必要地复制所有数据。

+1

你觉得这个词“物化'的意思?任何东西都可以成为材料而不占用任何空间? –

回答

3

一个物化视图完全是这样的 - 它通过创建一个包含查询定义的数据的表来“实现”数据。您可以通过删除物化视图,但保存的内容作为一个表证明这一点:

DROP MATERIALIZED VIEW xxx PRESERVE TABLE; 

这使一个名为XXX表不再刷新。所以,你的mat1视图确实复制了两个表中的所有数据。

想一想 - 如果它只是“引用”工会,那么这将是一个常规的看法,不是?在这种情况下,你不能吃你的蛋糕。

编辑:

你不能有一个complex materialized view快速刷新。诸如COUNT之类的聚合函数是导致视图变得复杂的因素之一。根据文档,联盟所有,所以我很惊讶你的mat1视图是快速刷新。

+0

有没有一种方法可以将'union all'和'count(*)'结合成一个快速刷新的物化视图的方式来重写'mat1'?如果不是,为什么不呢? – Clinton

0

是 - 它复制所有数据,否则这将是视图,无需任何令人耳目一新......

不知道,但你可以尝试:

create materialized view mat1 
refresh fast on commit 
(
    select data, sum (c) from 
    (
    select 1 x, data, count(*) c from table1 group by 1, data 
    union 
    select 2, data, count(*) from table1 group by 2, data 
) group by data 
);