0

更新に 10 時間かかる更新クエリがありますが、まだ更新段階にあり、約 135171 レコードしかありません。

uPDATE hr.raw_address ora
     SET (ora.addr_id,
          ) =
          (SELECT  oms.addr_id
                   FROM hr.addresss_oet OMSS,
                hr.master_address oms
          WHERE NVL (oms.addr_line1, '-1')     = NVL (OMSS.addr_line1, '-1')
                AND NVL (oms.addr_line2, '-1') = NVL (OMSS.addr_line2, '-1')
                AND NVL (oms.city, '-1')       = NVL (OMSS.city, '-1')
                AND NVL (oms.state, '-1')      = NVL (OMSS.state, '-1')
                AND NVL (oms.pstl_id, '-1')    = NVL (OMSS.pstl_id, '-1')
                AND ORA.ADDR_KEY               = OMSS.ADDR_KEY
           )
     WHERE ora.addr_id IS NULL;​

マスター テーブル (master_address には約 136000 のレコードがあります) と結合は oet (address_oet) テーブルに基づいており、マスター テーブルはアドレス フィールドに基づいて結合されます。アドレスが一致すると、マスター テーブルからそれぞれの addr_id を取得し、未加工テーブルと oet テーブルの addr_key の組み合わせに基づいて、未加工テーブルの addr_id を更新します。しかし、すでに9時間ですが、まだ更新が実行されています.

4

1 に答える 1

0

更新に時間がかかる理由は、where 条件 (各列の NVL) で使用している列ベースの関数です。

使用できるトリックはほとんどなく、役立つはずです

ベーステーブルの null 値を「NA」などの実際の値に置き換えます

pl/sqlカーソルをrownumカウンターとforループで使用して更新します(100レコードを返し、それらを更新し、次の100からそれらを除外する値でダミー列にフラグを立ててコミットします)これは、1つの理由で停止した場合に続行できるため、優れています中断した場所

于 2017-05-21T20:40:51.380 に答える