oracle pl / sql更新查询

时间:2017-05-20 02:33:19

标签: oracle performance optimization bulk-operations

我有一个更新查询需要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个小时但仍在更新中。

1 个答案:

答案 0 :(得分:0)

您的更新需要花费大量时间的原因是您在where条件中使用的基于列的功能(每列的NVL)

你可以使用一些技巧,它应该有帮助

使用' NA'

等实际值替换基表中的空值

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