Параллельный запуск Oracle For loop

#sql #oracle #for-loop #parallel-processing #sql-insert

#sql #Oracle #for-цикл #параллельная обработка #sql-вставка

Вопрос:

Я должен следовать sql для базы данных oracle на AWS RDS

 BEGIN
 FOR user_id_count IN 1..4000 LOOP
   INSERTUSERINTOFINALTABLE(user_id_count);
 END LOOP;
END;
  

где процедура INSERTUSERINTOFINALTABLE определяется следующим образом

 INSERT INTO FinalTable (USERID,  ABC,  DEF, ...,XYZ )
 select
  a.USERID,
  b.ABC,
  b.DEF,
  ....
  b.XYZ
from a
left outer join b on a.USERID = b.userid
where a.userid = USER_ID and b.XYZ not in ( select XYZ from c);
  

Причина, по которой я не делаю это для всех пользователей в виде простого insert int, заключается в том, что мои данные действительно большие и я хотел убедиться, что у меня не заканчивается память.

Вопрос в том, есть ли способ запустить это параллельно в oracle?

Спасибо

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

1. Теоретически вы могли бы использовать DBMS_JOB для создания множества заданий, но я не совсем уверен, что это хорошая идея в вашем случае.

Ответ №1:

Нет смысла вставлять много строк параллельно. Я объясню, почему.

Если insert оператор является единственным оператором в вашем цикле, операторы на самом деле не будут выполняться параллельно. Это потому insert , что оператор является атомарным.

У вас не может быть двух инструкций insert в одном сеансе, выполняемых одновременно, особенно когда ваша вставка основана на инструкции select из другой таблицы, которая, скорее всего, заблокирует таблицу для одновременных действий чтения.

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

1. @Amer: Маловероятно, что вы что-нибудь получите, запустив параллельно. Попробуйте оптимизировать свой sql и индексы. Это может помочь больше.

2. Мой sql очень прост… как вы думаете, я могу что-нибудь с этим сделать? любые изменения, которые я могу внести в исходные или целевые таблицы, которые могли бы помочь?

3. Вы отметили его Oracle. Вы ориентируетесь на MySQL или Oracle? Кстати, у обоих есть индексы.

4. Хорошо, тогда я неправильно понял. Тем не менее, индексы могут очень помочь в определенных обстоятельствах. Включение индекса b.userid, b.XYZ уже очень помогло бы.

5. Спасибо, Патрик … мои знания о Oracle очень ограничены… какой-либо конкретный тип индекса был бы полезен?