Вопрос

Я разрабатываю пакетный процесс в 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 минут, включая операцию записи файла.Спасибо всем за вашу помощь и предложения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top