2016-04-22 11 views
4

私はこのコードではPython(2.7)にsqlite3のに非常に効率的なバルク挿入を行うことができます。Sqlite3 Python:効率的な一括更新を行うには?

cur.executemany("INSERT INTO " + tableName + " VALUES (?, ?, ?, ?);", data) 

しかし、私は更新が効率的に動作させることはできません。私はそれがデータベース構造/索引付けの問題かもしれないと思っていましたが、100行のテーブルが1つしかないテストデータベースでさえ、更新にはまだ約2〜3秒かかります。

私は別のコードのバリエーションを試してみました。私が持っている最新のコードはthis answerからの更新とexecutemanyについて前の質問にあるが、それは私が作った他の試みとして私のために同じように遅いです:

data = [] 
for s in sources: 
    source_id = s['source_id'] 
    val = get_value(s['source_attr']) 
    x=[val, source_id] 
    data.append(x) 
cur.executemany("UPDATE sources SET source_attr = ? WHERE source_id = ?", data) 
con.commit() 

どのように私は大きなを行うには、このコードを向上させることができ一括更新は効率的ですか?

答えて

0

レコードを挿入する場合、データベースはちょうど(あなたがUNIQUE制約のようなものを持っていない限り)テーブルの末尾に行を記述する必要があります。

レコードを更新する場合、データベースが行を見つける必要があります。これは、検索列に索引を持っていない限り、(各コマンドのための)テーブル全体のスキャンが必要です。

CREATE INDEX whatever ON sources(source_id); 

しかしsource_idprimary keyであれば、あなただけ作成する(そのように宣言する必要があります暗黙のインデックス):

CREATE TABLE sources(
    source_id INTEGER PRIMARY KEY, 
    source_attr TEXT, 
    [...] 
); 
+0

感謝。すでにインデックスが作成されています。そこから改善することを願っています:) – LunaiThi

関連する問題