пакетная обработка 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 пользователей за раз. Может ли кто-нибудь предложить необходимые изменения?


person Kiran    schedule 24.02.2011    source источник


Ответы (1)


Это показывает способ накапливать пользователей по 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. Если вы используете другую версию, вам потребуется внести некоторые изменения.

person Dennis Williamson    schedule 24.02.2011