日期:2014-05-18  浏览次数:20659 次

求批量删除,批量更新的存储过程,数据有1000W条,急……
本人用数据库为DB2,数据量有1000W多条数据,批量更新和删除都老半天,sql语法如:
update tableName set status  =2  where pid in (1451,1564,1919);
delete from tableName  where pid in (1451,1564,1919);

执行半天,数据库都挂了,以前没写过存储过程,让大家笑话了,希望大家给个招,怎么写个批量删除,批量更新的存储过程,只操作一个表。
求批量删除,批量更新存储过程
求批量删除,批量更新存储过程
求批量删除,批量更新存储过程
求批量删除,批量更新存储过程
求批量删除,批量更新存储过程
求批量删除,批量更新存储过程
求批量删除,批量更新存储过程
求批量删除,批量更新存储过程
求批量删除,批量更新存储过程

------解决方案--------------------
虽然数据量是1000W级别,但是看起来你只需要操作 3 条而已,不应该速度很慢才对啊。

难道你 pid 字段没有索引?!
------解决方案--------------------
如果要删除整个表的话,truncate table 当然最快了。

如果不是,不知道你的表除了删除的这些记录,还有多少条?也可以把余下的数据导出来,然后把整表删除,最后把刚导出的数据导入回来。

如果常规方法删除的话,把记录日志的功能关掉也会快一些,当然这样就不能恢复了。
alter table tableName activate not logged initially with empty table; 
------解决方案--------------------
哦,DB2不支持truncate,用import from d:\empty.del of del replace into tablename
------解决方案--------------------
使用spring框架的的JdbcTemplate的execute(String callString,CallableStatementCallback action)调用存储过程实现批量删除、更新吧。
------解决方案--------------------
引用:
晕,不是3条,是300W多条,pid不是外键,,我改下
update tableName set status =2 where age in (23,24,25);
delete from tableName where age in (23,24,25);

可能得分开来分析,delete涉及的环节较多,先问问update;
如果update性能都很差,问题就显得比较严重了。

tableName 中,age字段有没有建立索引?
age字段值分布是否广泛还是取值比较少(最经典的是 性别,只有两个取值)?



顺便问下:你的表,有按照age做分区么?