数据量太大,一次性更新处理,会有日志文件太小(事务日志)、临时表空间不够用等问题。
采用分批次更新。
<update id="messageDonetime" >
UPDATE
(
select * from TMP_MESSAGE t where t.DONETIME IS NULL
fetch first #value# rows only
)
SET DONETIME=OUTTIME
</update>
但是ibatis不能够将fetch first #value# rows only解析对,具体原因不知道,望赐教。
后改用类似oracle的rownum处理
UPDATE
(
select * from
(
select t.*, ROW_NUMBER() OVER() as ROW_NUM
from TMP_MESSAGE t where t.DONETIME IS NULL
) as w
where w.ROW_NUM <= #dealNum#
)
SET DONETIME=OUTTIME
但是又带来新的问题,处理速度太慢,估计是最里面的select语句的原因
最后还是用fetch first,不再从外面传值
<update id="messageDonetime" >
UPDATE
(
select * from TMP_MESSAGE t where t.DONETIME IS NULL
fetch first 5000 rows only
)
SET DONETIME=OUTTIME
</update>
采用分批次更新。
<update id="messageDonetime" >
UPDATE
(
select * from TMP_MESSAGE t where t.DONETIME IS NULL
fetch first #value# rows only
)
SET DONETIME=OUTTIME
</update>
但是ibatis不能够将fetch first #value# rows only解析对,具体原因不知道,望赐教。
后改用类似oracle的rownum处理
UPDATE
(
select * from
(
select t.*, ROW_NUMBER() OVER() as ROW_NUM
from TMP_MESSAGE t where t.DONETIME IS NULL
) as w
where w.ROW_NUM <= #dealNum#
)
SET DONETIME=OUTTIME
但是又带来新的问题,处理速度太慢,估计是最里面的select语句的原因
最后还是用fetch first,不再从外面传值
<update id="messageDonetime" >
UPDATE
(
select * from TMP_MESSAGE t where t.DONETIME IS NULL
fetch first 5000 rows only
)
SET DONETIME=OUTTIME
</update>