質問
PeopleSoftアプリケーションエンジンでバッチプロセスを開発しています。
ジョブテーブルからステージングテーブルにデータを挿入しました。
合計120,596人の従業員があり、そのデータを処理しなければならない、これは開発環境です。
テスト環境では、処理される行数は249047です。
従業員のために送信されなければならない多くの非職務データがある。
私の設計は、テーブル内のデータを更新するために個々の更新文を書くことになり、ステージングテーブルからデータを選択してファイルに書き込みます。
アップデートは時間がかかりすぎています、私はそれを微調整するための手法を知りたいです。
多くのことを検索し、更新クエリで/* +Append */
を使用してみましたが、エラーメッセージ、sql command not ended
をスローします。
また、私のアップデートクエリは、NVLまたはNULL値をチェックする必要があります。
スタックオーバーフローでコードを共有する方法はあります。
手法を教えてください、私の目標は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'),' ') /
.
これは、データの2つのLAKHS行を処理する必要があるので5時間かかります。
処理をスピードアップできる方法はあります。つまり、ヒントまたはインデックスを使用していることを意味しますか?
また、これを使用していない場合、その他の値を更新する処理は非常に高速で、10分で終了します。
これを私を親切に助けてください。
ありがとう。
解決
私はこれを解決し、使用したテーブルOracleステートメントにマージされ、ファイルの書き込み操作を含めてプロセスは実行に10分かかります。あなたの助けと提案のためにすべてありがとう。