我正在peoplesoft应用程序引擎中开发批处理过程。

我已经从JOB table中插入了staging table中的数据。

总共有120,596名员工,他们的数据必须处理,这是在开发环境中。

在测试环境中,要处理的行数为249047。

有许多非工作数据也必须为员工发送。

我的设计是这样的,我将编写单独的update语句来更新表中的数据,然后我将从暂存表中选择数据并将其写入文件中。

更新花费了太多时间,我想知道一种技术来微调它。

搜索了很多东西,甚至尝试使用 /* +Append */ 在更新查询,但它抛出一个错误消息, sql command not ended.

此外,我的更新查询必须检查nvl或null值。

有什么方法可以通过stackoverflow共享代码,我的意思是,这是insert,update语句,用peoplesoft操作编写,以便这里的人们可以查看它?

请建议我一个技巧,我的目标是在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'), ' ') 

为了对此进行微调,我正在使用hint在我的暂存表中插入值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个小时,因为它必须处理2lakhs行数据。

有什么方法可以加快处理速度,我的意思是,使用提示或索引?

另外,如果我不使用这个,更新其他值的处理非常快,在10分钟内完成。

请帮我这个。

谢谢.

有帮助吗?

解决方案

我已经解决了这个问题,使用MERGE INTO TABLE oracle语句,现在该过程需要10分钟才能执行,包括文件写入操作。感谢大家的帮助和建议。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top