Oracle фиксирует цикл - PullRequest
       3

Oracle фиксирует цикл

0 голосов
/ 18 февраля 2019

У меня есть процедура, использующая цикл for для вставки строк из внешней таблицы в нормальную.В таблице около 6-7 столбцов.Прямо сейчас у меня есть коммит на каждую вставку, которая занимает около 20 минут, чтобы вставить записи 4mill.Можно ли оптимизировать это с помощью коммита на каждые 1К строк или 5К с помощью

if mod(i,5000)=0 then
commit;

, и вот как выглядит цикл сейчас:

FOR i IN 1..arr.COUNT
                    LOOP
                      begin
                              INSERT  INTO A(...)
                              values( ...);

                              commit;
                        end;
                   END LOOP;

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019
CURSOR xxx IS  
   SELECT 
     *
      FROM table t
      where t.id='abc';    
  for Viewxxx in xxx loop
     -- Add  logic here! 
  end loop;              
0 голосов
/ 18 февраля 2019

Как насчет ...

Insert into table
Select * from external_table;
Commit;
0 голосов
/ 18 февраля 2019

Один из способов - использовать функцию по модулю:

for i in 1 .. arr.count loop
  begin
    insert  into a (...)
    values ( ...);

    if mod(i, 5000) = 0 then
      commit;
    end if;
  end;

  commit;
end loop;

Однако часто гораздо лучше читать курсором по блокам и использовать вместо него FORALL.Я не знаю, возможно ли это с вашей внешней таблицей.

declare
  type type_table_of_sometable_rows is table of sometable%rowtype;
  v_array type_table_of_sometable_rows;
  cursor mycursor is select * from sometable;
begin
  open mycursor;
  loop
    fetch mycursor bulk collect into v_array limit 5000;
    exit when v_array.count = 0;
    forall i in 1 .. v_array.count
      insert into mytable values ( v_array(i).col1, v_array(i).col2) );
    commit;
  end loop;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...