У меня есть две очень большие корпоративные таблицы в базе данных 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. в операторе слияния при выполнении слияния с использованием удаленной базы данных. Шансы получить корпоративное обновление невелики, поэтому есть ли способ дополнительно оптимизировать мой первый запрос или написать его по-другому, чтобы он работал с максимальной производительностью?
Спасибо.