前几天,更新数据库中的表。目标表中有200,000条数据,需要更新其中一个字段。
1、前置条件
TableName: Destination
ColumnNames: ID、column1、column2...... column6、distance number(10,3)
任务:更新表中的100,000条记录的Distance列,使它的值为计算出的结果(每行的值不一定相同)。
2、方法1
每次更新表中一条数据,循环更新。
UPDATE DESTINATION T SET T.DISTANCE = #DISTANCE_VALUE# WHERE T.ID = #ID_VALUE#
结果:更新了大概30多分钟,即便开启了iBatis中的SqlMapClient.StartBatch(),速度还是不可想想。
3、方法2
创建临时表。先将每行的Distance和ID插入临时表中,然后批量更新。
临时表:TEMP_DISTANCE
列名:ID,DISTANCE
UPDATE DESTINATION T SET T.DISTANCE = (SELECT TEM.DISTANCE FROM TEMP_DISTANCE TEM WHERE T.ID = TEMP.ID)
EXISTS (SELECT 1 FROM TEMP_DISTANCE M WHERE T.ID = M.ID)
结果:更新大概持续了15分钟。
4、后续处理。
在方法2的基础上,为表DESTINATION的ID列添加索引,为TEMP_DISTANCE的ID列添加索引。
结果:更新基本上秒过。
5、结论
在处理大数据更新UPDATE操作时,给表加上索引能显著提高速度。