“联合所有”物化视图是否占用空间?

时间:2011-10-13 01:50:20

标签: sql oracle database-design materialized-views

在提交联合上快速刷新所有物化视图(在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
);

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

2 个答案:

答案 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
);