6

次のコードを使用して、Python (2.7) の Sqlite3 で非常に効率的な一括挿入を行うことができます。

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

しかし、更新を効率的に機能させることができません。データベースの構造/インデックスの問題かと思いましたが、100 行のテーブルが 1 つしかないテスト データベースでも、更新に 2 ~ 3 秒ほどかかります。

さまざまなコードのバリエーションを試しました。私が持っている最新のコードは、更新と実行に関する以前の質問に対するこの回答からのものですが、私が行った他の試みと同じくらい遅いです:

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()

このコードを改善して、大きな一括更新を効率的に行うにはどうすればよいでしょうか?

4

1 に答える 1

1

レコードを挿入するとき、データベースはテーブルの最後に行を書き込むだけで済みます (UNIQUE 制約のようなものがない限り)。

レコードを更新するとき、データベースは行を見つける必要があります。これには、検索列にインデックスがない限り、(コマンドごとに) テーブル全体をスキャンする必要があります。

CREATE INDEX whatever ON sources(source_id);

しかし、source_id主キーである場合は、そのように宣言する必要があります (暗黙のインデックスが作成されます)。

CREATE TABLE sources(
    source_id INTEGER PRIMARY KEY,
    source_attr TEXT,
    [...]
);
于 2016-04-22T08:01:51.180 に答える