基于远程表更新/插入表的最佳方法

Posted

技术标签:

【中文标题】基于远程表更新/插入表的最佳方法【英文标题】:Best way to update/insert into a table based on a remote table 【发布时间】:2010-05-06 14:15:24 【问题描述】:

我在一个 Oracle 10g 数据库中有两个非常大的企业表。一张表保存另一张表的历史信息。问题是,我的记录太多了,以至于我的插入更新花费了太长时间,并且我的会话被州长杀死了。

这是我更新过程的伪代码:

sqlsel := 'SELECT col1, col2, col3, col4 sysdate  
        FROM table2@remote_location dpi
         WHERE (col1, col2, col3) IN
               (
                SELECT col1, col2, col3
                  FROM table2@remote_location 
                 MINUS
                SELECT DISTINCT col1, col2, col3
                  FROM table1 mpc
                 WHERE facility = '''||load_facility||'''
               )';

EXECUTE IMMEDIATE sqlsel BULK COLLECT
                 INTO table1;

我已经尝试了 MERGE 语句:

MERGE INTO table1 t1
USING (
  SELECT col1, col2, col3  FROM table2@remote_location 
  ) t2
ON (
t1.col1 = t2.col1 AND
t1.col2 = t2.col2 AND
t1.col3 = t2.col3 
)

WHEN NOT MATCHED THEN
  INSERT (t1.col1, t1.col2, t1.col3, t1.update_dttm  )
  VALUES (t2.col1, t2.col2, t2.col3, sysdate  )

但是在使用远程数据库进行合并时,在 Oracle 10.2.0.4 之前的版本上似乎有 confirmed bug 的合并语句。获得企业升级的机会很小,所以有没有办法进一步优化我的第一个查询或以另一种方式编写它以使其以最佳性能运行?

谢谢。

【问题讨论】:

【参考方案1】:

您是否查看了物化视图来执行同步?可以在Ask Anantha. 找到一个不错的入口,这个Oracle white paper 也不错。

【讨论】:

谢谢!会调查的。一旦我们得到结果,我会回叫。【参考方案2】:

如果 table2@remote 中有重复的 col1/col2/col3 条目,那么您的查询将返回它们。如果不需要它们,那么你可以做一个

SELECT col1, col2, col3, sysdate  
FROM (
     SELECT col1, col2, col3
     FROM table2@remote_location 
     MINUS
     SELECT col1, col2, col3
     FROM table1 mpc
     WHERE facility = '''||load_facility||'''
     )

您也可以摆脱 DISTINCT。 MINUS 是一个集合操作,所以没有必要。

【讨论】:

哎呀..忘了提到我在 table2 的最上面的选择中还有另一列要选择,所以我无法从内部查询中选择它。

以上是关于基于远程表更新/插入表的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

管理联结表的最佳方法是啥? (删除并插入)

解析服务器:用远程数据更新本地存储的最佳方法是啥

基于异步响应轮询 Oracle 表的最佳方法

在访问中将数据插入多个表的最佳方法?

更新闭包表的最佳方法是啥?

第一次将数据从其他来源插入应用程序表的最佳方法是啥?