2011-10-13 65 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 
);