2012-01-26 4 views
0

Мне нужно загрузить данные из разных удаленных баз данных в нашу собственную базу данных. Я пишу один «сложный» запрос, используя оператор WITH. Это около 18 миллионов строк данных.Oracle: Вставка большого набора данных в таблицу

Что такое наиболее эффективный способ вставки?

  1. с помощью курсора вставить один за другим
  2. с помощью INSERT INTO

или есть другой способ?

+0

Некоторые вопросы. Это одноразовое упражнение или регулярное появление? Каково временное окно для запуска нагрузки? Сколько времени вы могли быть исходной и целевой базой данных? Насколько надежна связь между базами данных? Являются ли данные в исходной базе данных статичными (заархивированными) или динамическими (операционная система)? Что вы хотите выполнить с целевой базой данных, если процесс завершится неудачно (скажем, вы потеряете сетевое подключение)? – APC

ответ

4

Самый быстрый способ сделать что угодно - это использовать один оператор SQL. Следующим наиболее эффективным подходом является использование курсора, выполняющего операции BULK COLLECT для минимизации сдвигов контекста между SQL и PL/SQL-двигателями. Наименее эффективный подход - использовать курсор и обрабатывать данные по строкам.

+0

Спасибо, BULK COLLECT действительно полезен.^_^ – Ianthe

0

18 миллионов строк потребуют довольно много откат для вашего сценария с одним сценарием. Курсор для цикла будет намного медленнее, но вы сможете совершать все x строк.

Лично я пошел в старую школу и отправлялся в файл и загружал через sqlldr или насос данных, например, через базы данных.

+0

Имейте в виду, что фиксация каждой строки * x * приводит к большему количеству работы при перезагрузке процесса загрузки после ABEND. Также есть сценарии, когда может не иметь смысла подвергать частичную нагрузку более широкому взгляду. Однако я согласен, что 18 миллионов строк - это много, чтобы пропустить одну транзакцию. – APC

+0

Также 18 миллионов вложений не будут генерировать столько откат, сколько вы могли бы подумать: это в основном 18 миллионов рядов и некоторые метаданные. Речь идет только о том, чтобы DBA соответствующим образом оценивать табличное пространство UNDO. – APC

1

Как писал Джастин, наиболее эффективным подходом является использование одного оператора SQL (insert into ... select ...). Кроме того, вы можете воспользоваться direct-path insert

0

Вы можете использовать Data Synchronisation Studio и изменить отборное заявление принять 1 млн, в то время (я думаю, 18m сразу, вероятно, перегружать машину)

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