ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 包含不同表字段合并的快速刷新物化视图

包含不同表字段合并的快速刷新物化视图

原创 Linux操作系统 作者:yangtingkun 时间:2010-06-24 23:58:38 0 删除 编辑

以前写过一篇文章,介绍了两种情况无法进行快速刷新,今天ITPUB上有人问起这个问题。

ITPUB原贴:http://www.itpub.net/thread-1317638-1-1.html

两个导致物化视图无法快速刷新的问题:http://yangtingkun.itpub.net/post/468/38548

 

 

其实上一篇文章的最后已经点出了解决方法。下面通过一个简单的例子来说明这个问题:

SQL> CREATE TABLE T_BASE (ID NUMBER, NAME VARCHAR2(30));

表已创建。

SQL> CREATE TABLE T_FACT (ID NUMBER, FID NUMBER, NAME VARCHAR2(30));

表已创建。

SQL> ALTER TABLE T_BASE ADD PRIMARY KEY (ID);

表已更改。

SQL> ALTER TABLE T_FACT ADD PRIMARY KEY (ID);

表已更改。

SQL> ALTER TABLE T_FACT ADD CONSTRAINT FK_FACT_FID FOREIGN KEY (FID) REFERENCES T_BASE(ID);

表已更改。

SQL> CREATE MATERIALIZED VIEW LOG ON T_BASE   
  2  WITH ROWID, SEQUENCE          
  3  INCLUDING NEW VALUES;

实体化视图日志已创建。

SQL> CREATE MATERIALIZED VIEW LOG ON T_FACT
  2  WITH ROWID, SEQUENCE (FID)
  3  INCLUDING NEW VALUES;

实体化视图日志已创建。

SQL> CREATE MATERIALIZED VIEW MV_FACT_BASE
  2  REFRESH FAST
  3  AS SELECT F.ROWID ROWID_F,  
  4  B.ROWID ROWID_B,
  5  F.NAME NAME_F,
  6  B.NAME NAME_B
  7  FROM T_BASE B, T_FACT F
  8  WHERE B.ID = F.FID;

实体化视图已创建。

其实下面最简单的方法是通过VIEW来实现两个字段的合并:

SQL> CREATE VIEW V_FACT_BASE
  2  (ROWID_B, ROWID_F, NAME) AS
  3  SELECT ROWID_B,
  4  ROWID_F,
  5  NAME_F || NAME_B
  6  FROM MV_FACT_BASE;

视图已创建。

当然,如果愿意,完全可以通过嵌套一层物化视图来实现:

SQL> CREATE MATERIALIZED VIEW LOG ON MV_FACT_BASE
  2  WITH ROWID, SEQUENCE (ROWID_B, ROWID_F, NAME_B, NAME_F)
  3  INCLUDING NEW VALUES;

实体化视图日志已创建。

SQL> CREATE MATERIALIZED VIEW MV_COMBINE
  2  REFRESH FAST AS
  3  SELECT ROWID_B, ROWID_F, NAME_F || NAME_B NAME, COUNT(*) COUNT
  4  FROM MV_FACT_BASE
  5  GROUP BY ROWID_B, ROWID_F, NAME_F || NAME_B;

实体化视图已创建。

这种方式通过物化视图实现了最终的结果,不过代价相对比较大,个人更倾向于第一种方式用视图来实现这个功能。

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-666197/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1964
  • 访问量
    11077259