質問

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分かかります。あなたの助けと提案のためにすべてありがとう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top