1

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

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

4

2 回答 2

3

物化视图正是这样做的——它通过创建一个包含查询定义的数据的表来“物化”数据。您可以通过删除物化视图但将内容保留为表格来证明这一点:

DROP MATERIALIZED VIEW xxx PRESERVE TABLE;

它保留了一个不再刷新的名为 xxx 的表。因此,您的 mat1 视图确实复制了两个表中的所有数据。

想一想——如果它只是“引用”了工会,那么这将是一个常规视图,不是吗?在这种情况下,你不能吃蛋糕也不能吃。

编辑:

您无法快速刷新复杂的物化视图。诸如 COUNT 之类的聚合函数是导致视图复杂的因素之一。根据文档,UNION ALL 也是如此,所以我很惊讶您的 mat1 视图可以快速刷新。

于 2011-10-13T02:34:36.017 回答
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
);
于 2011-10-13T02:49:15.260 回答