2017-05-20 13 views
0

私は更新に10時間かかっている更新クエリを持っていますが、更新ステージ自体には約135171レコードしかありません。oracle pl/sqlの更新クエリ

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テーブルとrawテーブルのaddr_keyの組み合わせに基づいてrawテーブルのaddr_idを更新します。しかし、すでに9時間ですが、まだ更新が実行されています。

+0

あなたのアップデートが待っているブロックロックがないことを確認しましたか?ありがとう – alexgibbs

+0

テーブルにブロックセッションがありません。レコードを1つしか取っておらず、テーブルを更新しようとしましたが、秒間に更新されました。テーブルにブロックセッションがないと仮定できます。 –

+0

ですので、rawテーブルの各レコードに対して、更新する必要があります。マスターテーブルのすべての136000レコードをスキャンする必要があります。 1000レコードを更新する必要がある場合は、136 000 000のマスターレコードをスキャンする必要があります。すべての135171レコードを更新する必要がある場合は、135171 * 13600〜18 000 000 000レコードをスキャンする必要があります。 – miracle173

答えて

0

あなたのアップデートは、多くの時間を取っている理由は、あなたが条件(各列のNVL)

はあなたが使用できるいくつかのトリックがありますし、それが

を助けるべきであるところで使用している列ベースの機能です基底表のNULL値を 'NA'のような実際の値に置き換えます。

rownumカウンタとforループを使用してpl/sqlカーソルを使用して更新します(100レコードがそれらを更新し、それらを更新する戻り値次の100とコミット)は素晴らしいです。あなたが1つの理由で停止すると、 ftオフ

関連する問題