2011-02-24 7 views
1

J'ai un script shell qui lit ligne par ligne l'identifiant de l'utilisateur à partir d'un fichier et insère des enregistrements dans la base de données. Cependant le processus d'insertion est lent et je veux optimiser en prenant des lots. Je ne peux pas utiliser un fichier entier en un seul lot car la taille de la transaction dépasse les limites de propriété. Voici le script:Traitement par lots 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 

Commencer et valider sont les mots clés standard pour ce db. Ici, au lieu de traiter un utilisateur à la fois, je veux traiter 10 utilisateurs à la fois. Quelqu'un peut-il suggérer le changement nécessaire?

Répondre

1

Ceci montre un moyen d'accumuler 10 utilisateurs à la fois. Vous devrez le modifier en fonction de la façon dont vous avez besoin des données pour rechercher l'instruction insert. J'ai laissé la boucle interne en place, mais je l'ai changée en boucle for car cela fait que tout le contrôle se passe au même endroit. Vous n'avez peut-être pas besoin de cette boucle.

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 

Notez que ceci est écrit en utilisant la syntaxe ksh93. Si vous utilisez une autre version, vous devrez apporter quelques modifications.

Questions connexes