Chinaunix首页 | 论坛 | 博客
  • 博客访问: 606932
  • 博文数量: 841
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-28 10:08
文章分类

全部博文(841)

文章存档

2011年(1)

2008年(840)

我的朋友

分类:

2008-10-28 10:14:23

    首先描述一下更新的要求,根据远端数据库中几张表的关联结果来刷新本地表中一个字段的值。如果本地表中记录的ID在远端表关联中可以查询的到,则这条记录的相应字段更新为1,否则如果对应记录在远端无法查询到记录,则这个字段更新为0。

  这个需求比较简单,但是被更新表是物化视图复制的基表,需要将修改复制到多个远端物化视图中,因此,为了避免将过多不必要的修改传播到远端站点,这里有一个额外的要求,只更新当前状态不正确的记录。也就是说,更新之前要判断更新前和更新后是否一样,只有二者不一样才需要更新。

  最后一点要求是不建立临时表,使用SQL或者PL/SQL来尽量高效的实现这个功能。不使用临时表的要求是处于两点考虑,一是由于需求本身很简单,写SQL或PL/SQL最多也就十几行而已,为这么简单的需求建立一个临时表没有什么必要;另外一点是由于当前数据库版本为9204,INSERT INTO SELECT插入临时表存在bug,产生的REDO比插入普通表还要高,详细情况可以参考:临时表产生REDO过多的bug:

  下面还是通过例子来详细说明:

  SQL> CONN 已连接。

  SQL> CREATE TABLE T1 AS SELECT ROWNUM ID, A.* FROM DBA_OBJECTS A;

  表已创建。

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

  表已更改。

  SQL> CREATE TABLE T2 AS SELECT ROWNUM ID, B.* FROM DBA_SYNONYMS B;

  表已创建。

  SQL> CREATE INDEX IND_T2_ID ON T2(ID);

  索引已创建。

  SQL> ALTER TABLE T2 MODIFY ID NOT NULL;

  表已更改。

  SQL> CREATE TABLE T3 AS SELECT ROWNUM ID, C.OWNER, C.TABLE_NAME, C.COLUMN_NAME

  2 FROM DBA_TAB_COLUMNS C;

  表已创建。

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

  表已更改。

  SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T1')

  PL/SQL 过程已成功完成。 

[1]      

【责编:Zenghui】

--------------------next---------------------

阅读(206) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~