2011-02-24 157 views
1

我有一個shell腳本,它從文件中逐行讀取用戶標識,並將記錄插入到數據庫中。然而插入過程很慢,我想通過分批進行優化。由於事務大小超過專有限制,因此無法將整個文件作爲一個批處理使用。這裏是腳本:ksh批處理

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 - 
done 

開始和提交是這個數據庫的標準關鍵詞。在這裏,我不是一次處理一個用戶,而是一次處理10個用戶。有人可以建議需要改變嗎?

回答

1

這顯示了一次累積用戶10的方式。您將需要對其進行修改以適應您需要數據查找insert聲明的方式。我離開了內部循環,但將其更改爲for循環,因爲這使得所有控制都在一個地方發生。儘管你可能不需要那個循環。

process() { 
    # Somewhere in here you'll use the value of "[email protected]" 
    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語法編寫的。如果您使用的是其他版本,則需要進行一些修改。