2015-01-26 2 views
0

В настоящее время я вставляю данные из файла в таблицу. Я отформатирую данные перед их вставкой в ​​таблицу (Удалить вкладки/возврат каретки/получить коды символов для определенного текста и т. Д.). Во-первых, я должен проверить, существует ли запись и обновить ее, если это произойдет. Если это не значит, что запись должна быть вставлена ​​в таблицу.Массовая вставка и обновление и обновление одновременно

Проблема, с которой я сталкиваюсь, занимает очень много времени. У меня есть два файла: один с чуть менее 500 тыс. Записей и один с более чем 4 милями. Если можно запустить массовый сбор, чтобы я сделал оба?

E.G.

open c_cur; 
loop 
    fetch c_cur bulk collect into examp limit 50000; 
    exit when limit.count = 0 
    forall x in 1..limit.count 
    update table1 
    set... 
    where... 

    if sql%notfound then 
     insert into table1 
     values (...) 
    end if; 
    commit; 
end loop; 
close c_cur; 

Возможно ли это?

Я также слышал о настройке промежуточного стола и демпинге файла там, а затем оттуда. Это лучший вариант? Насколько я могу увеличить производительность?

Я также предпочел бы не делать слияние на столе из файла.

Спасибо.

+0

Вы можете использовать комбинацию FORALL и слияния. См. [Здесь] (http://www.morganslibrary.org/reference/plsql/array_processing.html#apfm) – Aramillo

ответ

0

Лучший способ сделать это - настроить внешние таблицы на основе файлов (вам нужно убедиться, что сервер базы данных может видеть каталог, в котором хранятся файлы). Таким образом, вы можете сделать заявление MERGE (нет необходимости в массовых сборах и т. П.), Что по-прежнему представляет собой пошаговый подход, даже если он немного эффективнее) непосредственно против внешних таблиц.

Следующим лучшим (IMHO) будет загрузка данных из файлов в промежуточную таблицу, а затем выполнение оператора слияния на основе промежуточной таблицы.

0

Вы можете использовать SQL% bulk_rowcount

--after forall update: 
for i in 1..examp.count loop 
    if sql%bulk_rowcount(i) > 0 then 
    examp.delete(i); -- record already updated - remove it from array 
    end if; 
end if; 

-- loop only non-deleted elements here 
forall i in indicies of examp 
    insert into .... 
Смежные вопросы