我正在尝试优化我的SQLite3插入,因为我正在处理一些大型数据集。
我想知道的是.execute(“INSERT ...”)语句是否为每个执行语句BEGIN和END一个事务?或者它只是在第一次执行时执行BEGIN,它等待.commit()操作,因此我可以执行10,000个.execute命令,然后执行.commit(),因此我只做了一次事务?
我对这个故事的那一方不是很清楚,我真的很感激任何有关此事的意见。
答案 0 :(得分:0)
默认情况下, sqlite3 模块在数据修改语言(DML)语句之前隐式打开事务(即
INSERT
/UPDATE
/DELETE
/ {{ 1}}),并在非DML非查询语句之前隐式提交事务(即REPLACE
或上述之外的任何语句)。
答案 1 :(得分:0)
来自SQLite优化常见问题解答[1]:
除非已经在事务中,否则每个SQL语句都有一个新的 交易开始了。这是非常昂贵的,因为它需要 重新打开,写入和关闭每个日志文件 声明。这可以通过包装SQL语句序列来避免 与BEGIN TRANSACTION;和END TRANSACTION;声明。这种加速 也可以获取不会改变数据库的语句。
所以,有两种方法:
BEGIN
和COMMIT
语句。 [1] http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html