Обновление Oracle SQL Update занимает несколько дней - PullRequest
1 голос
/ 01 июня 2010

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

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

Ответы [ 2 ]

7 голосов
/ 01 июня 2010

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

  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): как указывалось ранее, теперь это 4-й оператор DML в Oracle. Любые подсказки, которые мы могли бы добавить, следуют непосредственно за этим ключевым словом (т. Е. MERGE / * + HINT * /);

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

• USING (строка 3): предложение USING представляет исходный набор данных для MERGE. Это может быть одна таблица (как в нашем примере) или встроенное представление;

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

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

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

0 голосов
/ 03 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...