我有一个shell脚本,它从文件中逐行读取用户id并将记录插入到数据库中。然而,插入过程很慢,我想通过批处理进行优化。我不能将整个文件作为一批使用,因为事务大小超过了专有限制。下面是脚本:
for user in `cat $userlist`
do
echo "processing user $user"
{
echo "begin"
i=1
while [[ $i -le 30 ]] ; do
echo "insert into usertab values ($user,-1,\"\",-1)"
i=$(expr $i + 1)
done
echo "commit"
} | propSql userDb -
doneBegin和commit是这个数据库的标准关键字。在这里,我希望一次处理10个用户,而不是一次处理一个用户。有人能建议所需的改变吗?
发布于 2011-02-25 03:47:41
这显示了一种一次累积10个用户的方法。您需要修改它以适应查找insert语句所需数据的方式。我保留了内部循环,但将其更改为for循环,因为这使得所有的控制都发生在一个地方。不过,您可能不需要该循环。
process () {
# Somewhere in here you'll use the value of "$@"
echo "begin"
# you may not need this loop any more
for ((i=1; i<30; i++))
do
echo "insert into usertab values ($user,-1,\"\",-1)"
done
echo "commit"
}
j=0
while read -r user
do
echo "processing user $user"
if ! (( j++ % 10 )) # every tenth user, do a database operation
then
process "$accum" | propSql userDb -
accum=""
fi
accum+=" $user" # accumulate user names
done < "$userlist"
process "$accum" | propSql userDb - # one more time to get the remainder请注意,这是使用ksh93语法编写的。如果你使用的是另一个版本,你需要做一些修改。
https://stackoverflow.com/questions/5108207
复制相似问题