2010-05-06 3 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

Вы просматривали материализованные виды, чтобы выполнить синхронизацию? Довольно неплохо можно найти по адресу Ask Anantha. Это хорошо, Oracle white paper.

+0

Спасибо! Посмотрим. Я буду кричать назад, как только у нас появятся наши результаты. – jonasespelita

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

Упс .. забыл упомянуть, что у меня есть другой столбец для выбора в самом верхнем выборе из таблицы2, поэтому я не могу выбрать его из внутреннего запроса. – jonasespelita

Смежные вопросы