Обновить большое количество строк в Oracle

2

У меня сложилась такая ситуация, и я пытаюсь найти лучший способ ее решить. У меня есть база данных, скажем, DB-A, с таблицей T-A, которая имеет 2 поля - OID и PID. Эта таблица имеет около 1 миллиона строк. Теперь из-за какой-то другой проблемы PID большинства строк были неправильно установлены в 0, и это было найдено только через пару дней.

У меня есть резервная копия с двух дней назад, скажем, DB-B, и я думаю об обновлении DB-A с соответствующими записями из DB-B. Так что было бы лучшим способом сделать это? Я имею это в виду:

  • Создайте приложение .NET, которое получает строки из DB-B и обновляет соответствующие в DB-A. Не уверен, что это будет работать из-за большого количества строк. Возможно, потребуются отдельные коммиты в рамках транзакции с областью действия.
    1. Создайте .NET для создания файла Oracle SQLloader из DB-B и загрузки в DB-A

Ваши мысли очень ценятся...

спасибо Sunit

Теги:
ado.net

4 ответа

1

Если вы можете создать dblink из DB-A в DB-B, вы можете выполнить простое обновление из DB-A:

UPDATE (SELECT ta.pid ta_pid, tb.pid tb_pid
          FROM ta ta
          JOIN ta@backup tb ON (ta.oid = tb.oid))
   SET ta_pid = tb_pid;

Он будет работать, если OID является первичным ключом.

  • 0
    Я бы также подумал о том, чтобы переименовать таблицу в резервной базе данных, экспортировать ее и импортировать в текущую базу данных с новым именем. Затем выполните обновление в той же БД и удалите резервную копию таблицы.
0

Если у вас есть отношение 1-1 между DBA.TA и DBB.TB, сначала я удалю DBA.TA, а затем изменим ответ Asmodon UPDATE на INSERT.

Если это невозможно, я отключу/удалю каждое ограничение/индекс на DBA.TA, сделаю обновления, а затем повторно включит/создаст ограничения/индексы.

С уважением.

0

Невозможно загрузить резервную копию как (например,) T-B и выполнить запрос типа:

UPDATE T-A, T-B SET T-A.pid = T-B.pid WHERE T-A.oid = T-B.oid

Извините мой MySQL-ese SQL, но теоретически это работает.

-1

Для этого может быть встроенный инструмент, но если бы это был я, я бы, вероятно, использовал DB-B для создания списка операторов update и запускал их как script в DB-A.

Что-то вроде:

select 'update T-A set PID = ' || PID || ' where OID = ' || OID || ';' from T-A

(Предполагается, что OID является вашим основным ключом. Поскольку у вас есть большое количество строк, вам может потребоваться разбить его на несколько сценариев. Кто-то может предложить более элегантное решение.)

  • 0
    Забыл упомянуть, что OID имеет тип RAW16.
  • 0
    А миллион уникальных обновлений сделает ужасные вещи с вашей базой данных (то есть много разборов).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню