Как выполнить более 1 миллиона запросов на вставку в Oracle SQL Developer? - PullRequest
0 голосов
/ 16 октября 2018

У меня более 1 миллиона запросов на вставку, которые должны быть выполнены в Oracle SQL Developer, что занимает много времени.Есть ли способ, чтобы оптимизировать это.

Ответы [ 5 ]

0 голосов
/ 18 октября 2018

Вы можете поместить куски ваших данных в коллекцию и массовую вставку

Кроме того, удалите все индексы, кроме первичного ключа.Создание индексов после загрузки данных

может быть немного опасным, но в зависимости от качества данных вы также можете удалить внешние ключи и затем заново создать их после импорта данных.Вы должны быть уверены, что ваш импорт не нарушил отношения FK

declare
    type my_tab is table of mytable%rowtype index by binary_integer;
    a_imp   my_tab;
begin

    -- do stuff to populate a_imp from presumably a text file? or select statement

    -- you could chunk your population of the array and bulk insert say 10,000 rows at a time

    -- loop through the holding array and import any remaining data
    forall ix in 1 .. a_imp.count
        insert into [tabel_name] values a_imp(ix);
    commit;

end;
0 голосов
/ 16 октября 2018

SQL Developer - неправильный инструмент для запуска 1 000 000 вставок строка за строкой.

Так же, как и SQL * Plus.

Если вы не можете написать программу для вставки с использованием цикла или курсора или какого-либо массового сбора pl / sql, тогда делайте то, что предлагает @ marmite-bomber - запишите ваши данные втекстовый файл с разделителями и настройка сценария SQL * Loader.

Теперь вы можете использовать SQL Developer для этого.

enter image description here

Укажите на текстовый файл с разделителями.

Отобразите все на карту, а затем используйте этот метод ИМПОРТА.enter image description here

Как только это будет сделано, у вас будет набор сценариев bash или cmd, которые вам нужно будет выполнить.Но сначала вам понадобится клиент Oracle на вашем компьютере - вот где живет программа sqlldr.

Это на несколько порядков быстрее, чем запуск 1 000 000 отдельных вставок.И ваш администратор базы данных не будет вас ненавидеть.

С помощью мастера SQLDev вы сможете его запустить и запустить всего за несколько минут.

ДОКАЗАТЕЛЬСТВО: я протестировал простой сценарий - мои выводыбыли ( подробности здесь ): 10 353 записи вставляются в секунду для SQL * Loader 342 записи вставляются в секунду для SQL Developer

SQL * Loader был на 3,144% быстрее.

0 голосов
/ 16 октября 2018

У меня более 1 миллиона запросов на вставку, которые необходимо выполнить в Oracle SQL Developer

Из-за выполнения любого оператора SQL накладные расходы.Вы платите этот налог 1000000 раз.Кроме того, некоторые IDE создают отдельную вкладку для результата каждого оператора SQL, выполненного на листе (при запуске в один клик,).Я не могу вспомнить, делает ли это SQL Developer, но если это так, то это еще один налог, который вы платите 1000000 раз.

Две возможные оптимизации.

Squidge вставки из одной строки в набороперации выбора значений из dual:

insert into your_table
select blah_seq.nextval, q.txt, q.val from (
   select 'WHATEVER' as txt, 42 as val from dual union all
   select 'AND SO ON'  as txt, 23 as val  from dual union all
    ...
);

Это уменьшит накладные расходы.Для этого требуется много работы по редактированию.

В качестве альтернативы, используйте параметр массовой загрузки, такой как SQL * Loader или внешние таблицы, для загрузки данных.Если у вас есть редактор для программистов с поддержкой регулярных выражений (например, Notepad ++), то сравнительно просто исключить синтаксис insert и преобразовать предложение values в строки CSV.

Третий подход - возвратПерейдите к источнику, который создал миллион операторов вставки, и попросите их предоставить данные в более управляемом формате, например, при экспорте данных.

0 голосов
/ 16 октября 2018

еще одно предложение - проверить, нет ли у вас ошибок на возможных столбцах PK.Снимите ограничения перед вставкой и вставьте их обратно, как только закончите.Держите этот скрипт под рукой.Вы можете сделать это как часть одного и того же сценария или другого сценария.Опять же, если вы не проверяете наличие дуплексов и возвращаете ПК на ожидаемую ошибку;тогда вы будете гоняться за строками с дублированием и удалять эти данные.

0 голосов
/ 16 октября 2018

Запуск одной строки INSERT s не представляется возможным для такого количества строк.

Таким образом, одним из возможных способов является предварительная обработка сценария, извлечение только данных CSV.

Вот простой пример

Insert into TAB(COL1,COL2,COL3) values ('1','xxx',to_date('16-10-2018 15:13:49','DD-MM-YYYY HH24:MI:SS'));
Insert into TAB(COL1,COL2,COL3) values ('2','zzzzz',to_date('06-10-2018 15:13:49','DD-MM-YYYY HH24:MI:SS'));

удаление всех несущественных частей для получения

'1','xxx','16-10-2018 15:13:49'
'2','zzzzz','06-10-2018 15:13:49'

и загрузите этот файл с помощью SQL * Loader или внешней таблицы.Спектакль будет в порядке.

...