在我的应用程序中,我有一个包含大约200K记录的表,我需要在数据库中更新。如果DB中存在匹配的记录,然后插入或更新,我认为更快的方法是删除DB中的所有匹配记录并插入它们,而不是检查每条记录。我正在使用Spring JDBC框架。 要删除,我使用了Jdbctemplate batchUpdate方法和ParameterizedPreparedStatementSetter,对于插入,我使用的是SimplJdbcInsert。 插入工作正常,但批量删除性能非常慢。 我不太确定我应采取什么其他方法删除数据库中的记录并插入它们。任何建议都会非常有帮助。我正在使用SQL Server 2008 R2
ParameterizedPreparedStatementSetter<Order> vSetter =
new ParameterizedPreparedStatementSetter<Order>() {
@Override
public void setValues(PreparedStatement ps,
Order order) throws SQLException {
ps.setInt(1, order.getOrderNum());
}
};
getJdbcTemplate().batchUpdate("DELETE FROM Order WHERE OrderNum = ?",
aDemandOrders,
50000,
vSetter);
答案 0 :(得分:1)
性能低下的原因是数据库将收到批量语句但仍然逐个执行。
另一种方法是使用for i in {1..1000}; do
./PHASE test$i.inp test$i.out &
done
子句并手动批处理语句,以允许DB对每个批处理大小执行一个语句。
仍然可以获得查询缓存的好处,但是您不能简单地在一个#!/bin/bash
# Number of cores and range end
n=4
e=1000
# This function will do the processing
process() {
for ((i=$1; i <= $3; i += $2)); do
./PHASE test${i}.inp test${i}.out
echo "Done $i"
done
}
# For each core create a process and record the pid
for ((i=1; i <= n; i++)); do
process $i $n $e &
done
# Wait for each process to complete
wait
子句中发送所有内容,而应该对它们进行适当的批处理。
List[Byte]