#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 очень ограничены… какой-либо конкретный тип индекса был бы полезен?