【问题标题】:oracle pl/sql update queryoracle pl/sql 更新查询
【发布时间】:2017-05-20 02:33:19
【问题描述】:

我有一个更新查询需要 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条记录)和join是基于oet(address_oet)表和master表是基于地址字段join的。当地址匹配时,我们将从主表中获取相应的 addr_id,并根据 oet 表和原始表上的 addr_key 组合更新原始表中的 addr_id。但它已经 9 小时,但仍在更新。

【问题讨论】:

  • 只是为了确保,您是否确认没有阻塞锁可以等待您的更新?谢谢
  • 表上没有阻塞会话。我尝试只获取一条记录并更新表并在几秒钟内更新。所以我可以假设表上没有阻塞会话。
  • 因此,对于必须更新的原始表中的每条记录,您必须扫描主表的所有 136000 条记录。如果您必须更新 1000 条记录,那么您必须扫描 136 000 000 条主记录。如果您必须更新所有 135171 条记录,则必须扫描 135171*13600 ~ 18 000 000 000 条记录。
  • 是的!我可以得到任何替代选择吗?我需要在表上创建索引吗?
  • 过去 15 小时运行 @miracle173 需要多少时间。

标签: oracle performance optimization bulk-operations


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 2021-02-04
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2019-05-20
    相关资源
    最近更新 更多