我在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上使用远程数据库进行合并时的合并语句。获得企业升级的机会很渺茫,那么是否有办法进一步优化我的第一个查询或以另一种方式编写它以使其性能最佳?
谢谢。
谢谢!将研究它。一旦我们有了我们的结果,我会回来看看。 – jonasespelita 2010-05-07 03:26:37