Sqlite3 Python: как сделать эффективное массовое обновление?

Я могу делать очень эффективные массовые вставки в Sqlite3 на Python (2.7) с помощью этого кода:

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

Но я не могу заставить обновления работать эффективно. Я думал, что это может быть проблема структуры/индексации базы данных, но даже в тестовой базе данных только с одной таблицей из 100 строк обновление все еще занимает около 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()

Как я могу улучшить этот код, чтобы эффективно выполнять большое массовое обновление?


person LunaiThi    schedule 22.04.2016    source источник


Ответы (1)


При вставке записи базе данных просто нужно записать строку в конец таблицы (если у вас нет чего-то вроде ограничений UNIQUE).

При обновлении записи база данных должна найти строку. Это требует сканирования всей таблицы (для каждой команды), если у вас нет индекса в столбце поиска:

CREATE INDEX whatever ON sources(source_id);

Но если source_id является первичным ключом, вы должны просто объявить его как таковой (что создает неявный индекс ):

CREATE TABLE sources(
    source_id INTEGER PRIMARY KEY,
    source_attr TEXT,
    [...]
);
person CL.    schedule 22.04.2016
comment
Спасибо. Он уже проиндексирован. Надеюсь там поправиться :) - person LunaiThi; 24.04.2016