Fine tuning requête de mise à jour
-
26-12-2019 - |
Question
Je suis en train d'élaborer un processus de traitement par lots dans l'application peoplesoft moteur.
J'ai inséré des données dans la mise en scène de la table de TRAVAIL de la table.
Il y a 120,596 employés au total, dont les données doivent être traitées, c'est dans un environnement de développement.
Dans l'environnement de test, le nombre de lignes à traiter est 249047.
Il y a beaucoup de données sur l'emploi qui doivent aussi être envoyés pour les employés.
Ma conception est d'une telle façon que je vais écrire des instructions update pour mettre à jour les données dans la table, puis je sélectionne les données à partir de la mise en scène de la table et de l'écrire dans le fichier.
La mise à jour est prendre trop de temps, je voudrais savoir une technique permettant de l'affiner.
Recherché pour beaucoup de choses, et même essayé d'utiliser /* +Append */
dans la requête de mise à jour, mais il jette un message d'erreur, sql command not ended
.
Aussi, ma requête de mise à jour a pour vérifier nvl ou les valeurs null.
Est-il possible de partager le code sur stackoverflow, je veux dire, c'est l'insertion,de mise à jour de la déclaration, écrite dans peoplesoft actions, de sorte que les gens d'ici peuvent avoir un coup d'oeil à cela?
Veuillez me suggérer une technique, mon objectif est de terminer l'exécution dans les 5-10 minutes.
Mon instruction de mise à jour:
J'ai compris la cause.C'est cette instruction de mise à jour
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'), ' ')
Afin d'affiner ce,je suis de l'insertion de la valeur contact_oprid dans ma mise en scène de la table, à l'aide de l'indice.
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')
et de faire une mise à jour sur la mise en scène de la table:
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'),' ') /
Cela prendra 5 heures, comme il l'a traiter 2 lakhs de lignes de données.
Est-il possible à l'aide de lequel le traitement peut être prendre de la vitesse, je veux dire, à l'aide d'indicateurs ou d'indices?
Aussi, si je n'utilise pas cette, le traitement de mise à jour autre valeur est très rapide, se fini en 10 minutes.
De bien vouloir m'aider avec cela.
Merci.
La solution
J'ai résolu ce, utilisé de FUSION DANS la TABLE oracle déclaration, et maintenant, le processus ne prend que 10 minutes à exécuter, y compris l'écriture de fichier de l'opération.Merci à tous pour votre aide et suggestions.