JAVA MySQL或SQLSERVER处理大量update语句优化
在 MySQL 或者SQLSERVER 中处理大量 UPDATE 语句时,性能优化是一个关键问题。应该尽量使用批量更新而不是逐行更新,以下是一些常见的批量处理方式或者手段,您可以选择其中0个或多个,可以帮助提高 UPDATE 操作的效率:
1、使用 CASE 语句进行批量更新
UPDATE your_table
SET column1 = CASE id
WHEN 1 THEN 'value1'
WHEN 2 THEN 'value2'
-- 更多
END,
column2 = CASE id
WHEN 1 THEN 'value3'
WHEN 2 THEN 'value4'
-- 更多
END
WHERE id IN (1, 2, ...);
2、使用 JOIN 进行批量更新
UPDATE your_table t
JOIN (
SELECT id, new_value1, new_value2
FROM some_other_table
) s ON t.id = s.id
SET t.column1 = s.new_value1,
t.column2 = s.new_value2;
3、使用临时表
-- 创建临时表
CREATE TEMPORARY TABLE temp_table AS
SELECT id, new_value1, new_value2
FROM some_other_table;
-- 更新主表
UPDATE your_table t
JOIN temp_table tmp ON t.id = tmp.id
SET t.column1 = tmp.new_value1,
t.column2 = tmp.new_value2;
4、分批更新
// 示例代码(Java)
int batchSize = 1000;
for (int i = 0; i < totalRows; i += batchSize) {
int end = Math.min(i + batchSize, totalRows);
String sql = "UPDATE your_table SET column1 = 'new_value' WHERE id BETWEEN ? AND ?";
jdbcTemplate.update(sql, i, end - 1);
}
下面是一个拼接的例子:
protected void batchUpdateJcbmxStatus(List<LeavwAssetsBadjustmx> mxList){
StringBuffer sqlBuf=new StringBuffer();
sqlBuf.append("UPDATE adjustmx \n");
sqlBuf.append("SET mx_status = CASE id \n");
for(LeavwAssetsBadjustmx mx:mxList){
sqlBuf.append(" WHEN "+mx.getId()+" THEN "+mx.getMxStatus() +" \n");
}
sqlBuf.append(" END,mx_status_msg= CASE id \n");
for(LeavwAssetsBadjustmx mx:mxList){
sqlBuf.append(" WHEN "+mx.getId()+" THEN '"+mx.getMxStatusMsg()+"' \n");
}
sqlBuf.append(" END");
sqlBuf.append(" WHERE id IN (");
int index=0;
for(LeavwAssetsBadjustmx mx:mxList){
if(index++!=0) sqlBuf.append(",");
sqlBuf.append(mx.getId());
}
sqlBuf.append(" )");
log.info("sql:{}", sqlBuf.toString());
adjustmxMapper.executeBathUpdateState(sqlBuf.toString());
}
原文地址:https://blog.csdn.net/chengmin123456789/article/details/142492037
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!