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分种更新了数据库
这是怎么回事,那什么全部更新就不行呢?
求解释
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分种更新了数据库
这是怎么回事,那什么全部更新就不行呢?
求解释
不会
在运行时我的机子的CPU和内存都是够的啊。。是不是ORACLE里面有哪里设置了什么
我朋友说是不是因为Update 300W条数据因为会处理回滚所以到后面越来越慢
但我不太相信这个说法
and rownum <= 5000 -- 就是这里写循环他的条数
------------------你这样只更新了前5000条,,你后面的怎么写的??
and rownum > 5000 and rownum <= 10000????要是这样就错大了。。
and rownum <= 5000 -- 就是这里写循环他的条数
------------------你这样只更新了前5000条,,你后面的怎么写的??
and rownum > 5000 and rownum <= 10000????要是这样就错大了。。
有类似 rownum>5000 and rownum<10000?
ownum>0 and rownum<5000
rownum>5000 and rownum<10000
rownum>10000 and rownum<15000
...
...
rownum>2995000 and rownum<3000000
就是这样循环的。不然没有办法更新
这个问题我也遇到过 几十万 上百万的数据 全部更新 很长时间没反应
用动态sql循环 十几分钟就搞定了
估计是回滚段的问题 建议你看看sga的相关知识
我估计是 回滚段的内存一般就支持几万条数据 再多了就要利用硬盘空间来存放 这样 效率就会非常低
我们更新海量数据时 都是每更新5000-10000条数据就提交一次 具体数据视数据库而定想循环 可以用游标 或者根据你的具体业务
利用更新完后的数据和之前的数据的差别 用not exists(已更新的数据)来实现
如何用“想循环 可以用游标”来解决?
还是其他的方法,比如加大SGA?