2010-06-01 2 views
1

Я пытаюсь обновить запись в целевой таблице на основе записи, поступающей из источника. Например, если входящая запись присутствует в целевой таблице, я бы обновил их в целевом элементе, который я просто вставлял. У меня более миллиона записей в моем источнике, в то время как у моей цели 46 миллионов записей. Целевая таблица разбивается на календарный ключ. Я реализую всю эту логику с помощью Informatica. Я нахожу, что код Informatica отлично разбирается в журнале сеансов Informatica, но в обновлении требуется много времени (более 5 дней для обновления одного миллиона записей).Запрос Oracle SQL Update требует времени для обновления

Любые предложения относительно того, что можно сделать по сценарию для повышения производительности?

+1

Чтобы спасти кого-либо еще, выполняющего математику, один миллион за пять дней составляет порядка 140 минут или 2 секунды. –

+1

Что говорит объяснительный план? Можете ли вы публиковать заявления? – Martin

ответ

7

Вы можете попробовать это

1 MERGE 
    2  INTO target_table tgt 
    3  USING source_table src 
    4  ON (src.object_id = tgt.object_id) 
    5 WHEN MATCHED 
    6 THEN 
    7  UPDATE 
    8  SET tgt.object_name = src.object_name 
    9  ,  tgt.object_type = src.object_type 
10 WHEN NOT MATCHED 
11 THEN 
12  INSERT (tgt.object_id 
13   , tgt.object_name 
14   , tgt.object_type) 
15  VALUES (src.object_id 
16   , src.object_name 
17   , src.object_type); 

Синтаксис сначала выглядит немного устрашающе, но если мы читаем через сверху вниз, это вполне интуитивно. Обратите внимание на следующие пункты:

• MERGE (строка 1): как указано ранее, это уже четвертый оператор DML в Oracle. Любые подсказки, которые мы могли бы добавить, напрямую следуют этому ключевому слову (т. Е. MERGE/* + HINT * /);

• INTO (строка 2): так мы указываем цель для MERGE. Цель должна быть либо таблицей, либо обновляемым представлением (встроенное представление здесь не может быть использовано);

• ИСПОЛЬЗОВАНИЕ (строка 3): предложение USING представляет собой исходный набор данных для MERGE. Это может быть отдельная таблица (как в нашем примере) или в виде строки;

• ON() (строка 4): предложение ON - это то, где мы поставляем соединение между исходным набором данных и целевой таблицей. Обратите внимание, что условия соединения должны быть в скобках;

• WHEN MATCHED (строка 5): в этом разделе мы инструктируем Oracle о том, что делать, когда у нас уже есть соответствующая запись в целевой таблице (т. Е. Существует соединение между исходными и целевыми наборами данных). В этом случае мы, очевидно, хотим UPDATE. Одним из ограничений этого предложения является то, что мы не можем обновить ни один из столбцов, используемых в предложении ON (хотя, конечно, нам не нужно, поскольку они уже совпадают). Любая попытка включить столбец объединения приведет к возникновению неинтуитивного исключения недействительного идентификатора; и

• КОГДА НЕ СООТВЕТСТВУЕТ (строка 10): этот раздел является местом, где мы записываем записи INSERT, для которых нет текущего совпадения.

+0

Проголосовали. Вы не хотите делать эту шкалу обновлений в строке за строкой или вытаскивать миллионы записей из базы данных и отталкивать их (особенно по сети). Вставьте логику в БД. –

0

Я не уверен, как это применимо к вашему проекту, поскольку вам может потребоваться многое изменить. Поскольку вы имеете дело с миллионами записей, я бы рекомендовал пакетную работу. Вы можете использовать утилиту SQL Loader. Но это зависит от формата источника. Если это файл (например, файл csv), это правильный выбор.

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