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

Sql 基于远程表更新/插入表的最佳方法,sql,oracle,optimization,oracle10g,query-optimization,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 (

我在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  )
但在使用远程数据库进行合并时,merge语句中似乎存在Oracle 10.2.0.4之前版本的错误。获得企业级升级的机会微乎其微,那么有没有办法进一步优化我的第一个查询,或者以另一种方式编写它,使其以最佳性能运行


谢谢。

您是否查看了物化视图以执行同步?在这里可以找到一个非常好的视图,这也很好。

您是否查看了物化视图以执行同步?在这里可以找到一个非常好的into也很好。

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

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||'''
     )

你也可以去掉那些明显的。减号是一个集合操作,因此它是不必要的。

如果在table2@remote,则您的查询将返回它们。如果不需要它们,那么您可以

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||'''
     )

你也可以去掉那些明显的。减号是一个集合运算,因此它是不必要的。

Oops。。忘了提到我在最上面的select from table2中还有另一列要选择,所以我无法从内部查询中选择它。。忘了提到我在最上面的select from table2中还有一列要选择,所以我无法从内部查询中选择它。谢谢!我会调查的。一旦我们有结果,我会叫回来的。谢谢!我会调查的。一旦我们有了结果,我会叫回来的。