我正在开发peoplesoft应用程序引擎中的批处理。
我已从JOB表中插入临时表中的数据。
总共有120,596名员工,其数据必须处理,这是在开发环境中。
在测试环境中,要处理的行数为249047。
还有许多非工作数据也必须发送给员工。
我的设计是这样的,我将编写单独的更新语句来更新表中的数据,然后我将从登台表中选择数据并将其写入文件。
更新花费了太多时间,我想知道一种微调技术。
搜索了很多内容,甚至尝试在更新查询中使用/* +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'), ' ')
为了对此进行微调,我使用提示在我的临时表中插入值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分钟内完成。
请帮助我。
感谢。
答案 0 :(得分:1)
我已经解决了这个问题,使用了MERGE INTO TABLE oracle语句,现在该过程需要10分钟才能执行,包括文件写入操作。感谢大家的帮助和建议。