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)

您可以使用一些技巧,它应该会有所帮助

用“NA”等实际值替换基表中的空值

使用带有 rownum 计数器的 pl/sql 游标和 for 循环来更新(返回 100 条记录更新它们并标记一个带有值的虚拟列以将它们从下一个 100 中排除并提交)这很好,因为如果你因为一个原因停止你可以继续你离开的地方

于 2017-05-21T20:40:51.380 回答