Лучший способ обновить/вставить в таблицу на основе удаленной таблицы

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

Спасибо.


person jonasespelita    schedule 06.05.2010    source источник


Ответы (2)


Вы смотрели на материализованные представления для выполнения синхронизации? Неплохой вопрос можно найти на странице Спросите Ананту. белая книга Oracle тоже хороша.

person DCookie    schedule 06.05.2010
comment
Спасибо! Рассмотрю это. Я перезвоню, когда у нас будут результаты. - person jonasespelita; 07.05.2010

Если в 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. МИНУС - это заданная операция, поэтому в ней нет необходимости.

person Gary Myers    schedule 06.05.2010
comment
Упс... забыл упомянуть, что у меня есть еще один столбец для выбора в самом верхнем списке из таблицы 2, поэтому я не могу выбрать его из внутреннего запроса. - person jonasespelita; 07.05.2010