首页 文章

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

提问于
浏览
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
);

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

2 回答

  • 0

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

    DROP MATERIALIZED VIEW xxx PRESERVE TABLE;
    

    这使得一个名为xxx的表不再刷新 . 因此,您的mat1视图确实复制了两个表中的所有数据 .

    想一想 - 如果它只是“引用”了联盟,那么这将是一个常规的观点,不是吗?在这种情况下,你不能吃蛋糕也不能吃 .

    编辑:

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

  • 3

    是的 - 它复制了所有数据,否则它将被视图而不需要任何刷新......

    不确定,但你可以尝试:

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

相关问题