2011-02-24 3 views
1

파일에서 사용자 ID를 한 줄씩 읽은 다음 데이터베이스에 레코드를 삽입하는 셸 스크립트가 있습니다. 그러나 삽입 프로세스가 느리고 배치를 가져 와서 최적화하고 싶습니다. 트랜잭션 크기가 독점 제한을 초과하므로 전체 파일을 하나의 배치로 사용할 수 없습니다. 다음은 스크립트입니다.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 

시작 및 커밋은이 db의 표준 키워드입니다. 여기에서는 한 번에 한 명의 사용자를 처리하는 대신 한 번에 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 구문을 사용하여 작성되었습니다. 다른 버전을 사용하는 경우 수정해야합니다.