Запрос на обновление точной настройки
-
26-12-2019 - |
Вопрос
Я разрабатываю пакетный процесс в peoplesoft application engine.
Я вставил данные в промежуточную таблицу из таблицы ЗАДАНИЙ.
Всего насчитывается 120 596 сотрудников, чьи данные должны быть обработаны, это делается в среде разработки.
В тестовой среде количество строк, подлежащих обработке, равно 249047.
Существует много данных, не связанных с работой, которые также должны быть отправлены для сотрудников.
Мой дизайн устроен таким образом, что я напишу отдельные инструкции update для обновления данных в таблице, затем я выберу данные из промежуточной таблицы и запишу их в файл.
Обновление занимает слишком много времени, я хотел бы знать технику его точной настройки.
Искал много вещей и даже пробовал использовать /* +Append */
в запросе на обновление, но он выдает сообщение об ошибке, sql command not ended
.
Кроме того, мой запрос на обновление должен проверять наличие значений nvl или null.
Есть ли какой-нибудь способ поделиться кодом через stackoverflow, я имею в виду, это инструкция insert, update, написанная в peoplesoft actions, чтобы люди здесь могли ознакомиться с этим?
Пожалуйста, предложите мне технику, моя цель - закончить выполнение в течение 5-10 минут.
Мое заявление об обновлении:
Я выяснил причину.Это это заявление об обновлении
UPDATE %Table(AZ_GEN_TMP)
SET AZ_HR_MANAGER_ID = NVL((
SELECT e.emplid
FROM PS_EMAIL_ADDRESSES E
WHERE UPPER(SUBSTR(E.EMAIL_ADDR, 0, INSTR(E.EMAIL_ADDR, '@') -1)) = (
SELECT c.contact_oprid
FROM ps_az_can_employee c
WHERE c.emplid = %Table(AZ_GEN_TMP).EMPLID
AND c.rolename='HRBusinessPartner'
AND c.seqnum = (
SELECT MAX(c1.seqnum)
FROM ps_az_can_employee c1
WHERE c1.emplid= c.emplid
AND c1.rolename= c.rolename ) )
AND e.e_addr_type='PINT'), ' ')
Чтобы точно настроить это, я вставляю значение contact_oprid в свою промежуточную таблицу, используя подсказку.
SELECT /* +ALL_ROWS */ c.contact_oprid
FROM ps_az_can_employee c
WHERE c.emplid = %Table(AZ_GEN_TMP).EMPLID
AND c.rolename='HRBusinessPartner'
AND c.seqnum = (
SELECT MAX(c1.seqnum)
FROM ps_az_can_employee c1
WHERE c1.emplid= c.emplid
AND c1.rolename= c.rolename ) )
AND e.e_addr_type='PINT')
и выполнение обновления промежуточной таблицы:
UPDATE staging_table
SET AZ_HR_MANAGER_ID = NVL((
SELECT e.emplid
FROM PS_EMAILtable E
WHERE UPPER(REGEXP_SUBSTR(e.email_addr,'[^@]+',1,1)) = staging_table.CONTACT_OPRID
AND e.e_addr_type='PINT'),' ') /
Это займет 5 часов, так как необходимо обработать 2 тысячи строк данных.
Есть ли какой-либо способ ускорить обработку, я имею в виду, используя подсказки или индексы?
Кроме того, если я не использую это, обработка для обновления другого значения выполняется очень быстро, завершается через 10 минут.
Пожалуйста, помогите мне с этим.
Спасибо.
Решение
Я решил эту проблему, использовал инструкцию oracle MERGE INTO TABLE, и теперь выполнение процесса занимает 10 минут, включая операцию записи файла.Спасибо всем за вашу помощь и предложения.