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

时间:2010-05-06 14:15:25

标签: sql oracle optimization oracle10g query-optimization

我在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。获得企业升级的可能性很小,那么有没有办法进一步优化我的第一个查询或以另一种方式编写它以使其以最佳性能运行?

感谢。

2 个答案:

答案 0 :(得分:1)

您是否查看了物化视图以执行同步?可以在Ask Anantha.找到相当不错的内容。Oracle white paper也很好。

答案 1 :(得分:0)

如果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是一个固定操作,因此没有必要。