2010-05-06 45 views
1

我在Oracle 10g数据库中有两个非常大的企业表。一张表保存另一张表的历史信息。问题是,我已经到了记录太多的地步,我的插入更新时间过长,我的会话被州长杀死。基于远程表更新/插入表的最佳方法

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

sqlsel := 'SELECT col1, col2, col3, col4 sysdate 
     FROM [email protected]_location dpi 
     WHERE (col1, col2, col3) IN 
       (
       SELECT col1, col2, col3 
        FROM [email protected]_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 [email protected]_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 ) 

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

谢谢。

回答

1

你看过Materialized Views来执行同步吗?一个相当不错的可以在Ask Anantha.找到这Oracle white paper也很好。

+0

谢谢!将研究它。一旦我们有了我们的结果,我会回来看看。 – jonasespelita 2010-05-07 03:26:37

0

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

SELECT col1, col2, col3, sysdate 
FROM (
    SELECT col1, col2, col3 
    FROM [email protected]_location 
    MINUS 
    SELECT col1, col2, col3 
    FROM table1 mpc 
    WHERE facility = '''||load_facility||''' 
    ) 

你也可以摆脱DISTINCT。 MINUS是一套操作,所以它是不必要的。

+0

糟糕..忘了提及我有另一列在table2的最上面的select中选择,所以我无法从内部查询中选择它。 – jonasespelita 2010-05-07 03:25:25