在提交联合上快速刷新所有物化视图(在Oracle中)是否复制了所有基础数据,或者只是对它有引用?
如果此物化视图确实复制了所有数据,则无论如何都要执行以下操作:
create table3 as ( table1 union all table2 );
这样我就可以在table3上创建索引和物化视图日志,而表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
);
但是我担心第一个物化视图会不必要地复制所有数据。
答案 0 :(得分:3)
物化视图就是这样 - 它通过创建包含查询定义的数据的表来“实现”数据。您可以通过删除实例化视图但将内容保存为表来证明这一点:
DROP MATERIALIZED VIEW xxx PRESERVE TABLE;
保持名为xxx的表不再刷新。因此,您的mat1视图确实复制了两个表中的所有数据。
想一想 - 如果它只是“引用”了联盟,那么它将是一个常规视图,不是吗?在这种情况下,你不能吃蛋糕,也不能吃。
编辑:
您无法在complex materialized view上快速刷新。诸如COUNT之类的聚合函数是导致视图复杂的因素之一。根据文档,UNION ALL也是如此,所以我很惊讶你的mat1视图可以快速刷新。
答案 1 :(得分: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
);