SQL:
t_p_ds 300W
t_p_dw 250W
执行:
------------------------------
update t_p_ds a
set    dwbh = (select dwbh
               from   t_p_dw
               where  ROWNUM < 2
                      and nsrbm = a.col002
                      and zzjgdm = replace(a.col004,'-',''))
where  exists (select 1
               from   t_p_dw
               where  nsrbm = a.col002
                      and zzjgdm = replace(a.col004,'-',''))
       and a.dwbh is null
       and a.col002 is not null
       and a.col004 is not null
-----------------------------------
以上语句一天都没有执行完
后来分段进行更新为
-------------------------
update t_p_ds a
set    dwbh = (select dwbh
               from   t_p_dw
               where  ROWNUM < 2
                      and nsrbm = a.col002
                      and zzjgdm = replace(a.col004,'-',''))
where  exists (select 1
               from   t_p_dw
               where  nsrbm = a.col002
                      and zzjgdm = replace(a.col004,'-',''))
       and a.dwbh is null
       and a.col002 is not null
       and a.col004 is not null
       and rownum > 0
       and rownum <= 5000  -- 就是这里写循环他的条数
------------------------------------
用了5分种更新了数据库
这是怎么回事,那什么全部更新就不行呢?
求解释

解决方案 »

  1.   

    锁表了?
    不会
    在运行时我的机子的CPU和内存都是够的啊。。是不是ORACLE里面有哪里设置了什么
    我朋友说是不是因为Update 300W条数据因为会处理回滚所以到后面越来越慢
    但我不太相信这个说法
      

  2.   

      and rownum > 0
      and rownum <= 5000 -- 就是这里写循环他的条数
    ------------------你这样只更新了前5000条,,你后面的怎么写的??
      and rownum > 5000  and rownum <= 10000????要是这样就错大了。。
      

  3.   

    and rownum > 0
      and rownum <= 5000 -- 就是这里写循环他的条数
    ------------------你这样只更新了前5000条,,你后面的怎么写的??
      and rownum > 5000 and rownum <= 10000????要是这样就错大了。。
      

  4.   

    rownum > 0是多余的。无执行计划无真相。
      

  5.   

    莫非你循环的时候是根据rownum循环的?
    有类似 rownum>5000 and rownum<10000?
      

  6.   

    是啊开始是
    ownum>0 and rownum<5000
    rownum>5000 and rownum<10000
    rownum>10000 and rownum<15000
    ...
    ...
    rownum>2995000 and rownum<3000000
    就是这样循环的。不然没有办法更新
      

  7.   

    你这么更新是不对的 首先要搞明白rownum的用法
    这个问题我也遇到过 几十万 上百万的数据 全部更新 很长时间没反应
    用动态sql循环 十几分钟就搞定了
    估计是回滚段的问题 建议你看看sga的相关知识
    我估计是 回滚段的内存一般就支持几万条数据 再多了就要利用硬盘空间来存放 这样 效率就会非常低
    我们更新海量数据时 都是每更新5000-10000条数据就提交一次 具体数据视数据库而定想循环 可以用游标 或者根据你的具体业务 
    利用更新完后的数据和之前的数据的差别 用not exists(已更新的数据)来实现
      

  8.   

    啊因为我是用MS-SQL的没有用地Oracle,那这样的话
    如何用“想循环 可以用游标”来解决?
    还是其他的方法,比如加大SGA?