0

sqlite データベースを更新して、bin0 から 100 までの数字で埋められた新しい列を作成しています。私が抱えているいくつかのパフォーマンスの問題を示す簡単なスクリプトを作成しました。

import sqlite3

conn = sqlite3.connect('partition_dev.db')
db_parts = conn.cursor()

i = 0
for row in db_parts.execute('''SELECT * from parts''').fetchall():
    db_parts.execute('''UPDATE parts set bin=? where entry=?''',(i,str(row[0])))
    conn.commit()
    i = i+1
    print i
    if i>100:
        i=0

これは、65K 行のデータベースの場合、非常に長い時間実行されます。私はSQLを扱うのが初めてなので、明らかに最適ではないことをしていると思いますが、何がわからないのですか。この更新プログラムのパフォーマンスを向上させるにはどうすればよいですか?

4

1 に答える 1

6

すべての行をコミットしています。そうしないで、すべての行が更新されたときにコミットしてください。

カウンターにはi、無限ジェネレーターを使用できます。count_to関数は 0 から 100 までの数値を生成し、0 から無限に開始します。

def count_to(n):
    while True:
        for i in range(n):
            yield i

to100 = count_to(101)
for row in db_parts.execute('''SELECT * from parts''').fetchall():
    i = to100.next()
    db_parts.execute('''UPDATE parts set bin=? where entry=?''',
        (i, str(row[0]))
    )
    print i
conn.commit()
于 2012-09-21T15:03:05.100 に答える