Pergunta

Estou desenvolvendo um processo em lote no mecanismo de aplicativos PeopleSoft.

Inseri dados na tabela intermediária da tabela JOB.

São 120.596 funcionários no total, cujos dados precisam ser processados, isso está em ambiente de desenvolvimento.

No ambiente de teste, o número de linhas a serem processadas é 249.047.

Existem muitos dados não relacionados ao trabalho que também devem ser enviados para os funcionários.

Meu design é de forma que escreverei instruções de atualização individuais para atualizar os dados na tabela, depois selecionarei os dados da tabela intermediária e os escreverei no arquivo.

A atualização está demorando muito, gostaria de saber uma técnica para ajustá-la.

Pesquisei muitas coisas e até tentei usar /* +Append */ na consulta de atualização, mas gera uma mensagem de erro, sql command not ended.

Além disso, minha consulta de atualização deve verificar valores nvl ou nulos.

Existe alguma maneira de compartilhar o código através do stackoverflow, quero dizer, esta é a instrução insert,update, escrita em ações peoplesoft, para que as pessoas aqui possam dar uma olhada nisso?

Por favor, sugira-me uma técnica, meu objetivo é terminar a execução em 5 a 10 minutos.

Minha declaração de atualização:

Eu descobri a causa.É esta declaração de atualização

 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'), ' ') 

Para ajustar isso, estou inserindo o valor contact_oprid em minha tabela de teste, usando dica.

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')

e fazendo uma atualização na tabela de teste:

 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'),' ') /

Isso levará 5 horas, pois será necessário processar 2 lakhs de linhas de dados.

Existe alguma maneira de acelerar o processamento, ou seja, usando dicas ou índices?

Além disso, se eu não usar isso, o processamento para atualizar outro valor é muito rápido, finaliza em 10 minutos.

Por favor, me ajude com isso.

Obrigado.

Foi útil?

Solução

Eu resolvi isso, usei a instrução oracle MERGE INTO TABLE e agora o processo leva 10 minutos para ser executado, incluindo a operação de gravação de arquivo.Obrigado a todos pela sua ajuda e sugestões.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top