Страницы

Поиск по вопросам

понедельник, 4 марта 2019 г.

Insert большого количества строк Oracle

Есть задача загрузки csv файла через Web интерфейс. Во время загрузки на стороне клиента выполняются проверки на корректность данных в файле. Сейчас мы вставляем миллионы строк вызывая процедуру вставки одной строки. То есть, для каждой строки файла вызывается процедура. Схематичный вид процедуры:
procedure example(iValue1 IN Table.column1, iValue2 IN Table.column2, iValue3 IN Table.column3) is begin insert into table(column1, column2, column3) values (iValue1, iValue3, iValue3); end;
Вызов миллионов раз это процедуры работает непозволительно медленно. Как можно изменить подход для ускорения процесса вставки?


Ответ

Если нет возможности воспользоваться SQL*loader или insert from External Table, то можно попробовать использовать bulk insert
DECLARE TYPE prod_tab IS TABLE OF products%ROWTYPE; products_tab prod_tab := prod_tab(); start_time number; end_time number; BEGIN -- Populate a collection - 100000 rows SELECT * BULK COLLECT INTO products_tab FROM products;
EXECUTE IMMEDIATE 'TRUNCATE TABLE products'; Start_time := DBMS_UTILITY.get_time; FOR i in products_tab.first .. products_tab.last LOOP INSERT INTO products (product_id, product_name, effective_date) VALUES (products_tab(i).product_id, products_tab(i).product_name, products_tab(i).effective_date); END LOOP; end_time := DBMS_UTILITY.get_time; DBMS_OUTPUT.PUT_LINE(‘Conventional Insert: ’||to_char(end_time-start_time));
EXECUTE IMMEDIATE 'TRUNCATE TABLE products'; Start_time := DBMS_UTILITY.get_time; FORALL i in products_tab.first .. products_tab.last INSERT INTO products VALUES products_tab(i); end_time := DBMS_UTILITY.get_time; DBMS_OUTPUT.PUT_LINE(‘Bulk Insert: ’||to_char(end_time-start_time)); COMMIT; END;
Примеры использования BULK COLLECT и FORALL...

Комментариев нет:

Отправить комментарий