我在插入行时发现 APSW(Python 的 SQLite 解析器)存在以下问题。
假设我的数据是 data = [[1,2],[3,4]]
APSW 和 SQLite3 允许我做类似的事情:
apsw.executemany("INSERT INTO Table VALUES(?,?)", b)
或者我可以编写一些代码来执行以下操作:
sql = "BEGIN TRANSACTION;
INSERT INTO Table Values('1','2');
INERT INTO Table Values('3','4');
COMMINT;"
apsw.execute(sql)
当 data
是一个长列表/数组/表时,第一种方法的性能与第二种方法相比非常慢(对于 400 行,它可能是 20 秒而不是 1 秒!)。我不明白为什么会这样,因为这是所有 SQLite Python 教程中显示的将数据添加到表中的方法。
知道这里会发生什么吗?
最佳答案
(披露:我是 APSW 的作者)。如果你没有明确地让一个事务生效,那么 SQLite 会自动在每个语句的开头启动一个事务,并在每个语句的末尾结束。写入事务是持久的——这意味着内容必须最终存储在存储中并调用 fsync 以确保它们能够在意外的电源或系统故障中幸存下来。存储速度慢!
我建议在您的情况下使用 with
而不是 BEGIN/COMMIT,因为它会在出错时自动回滚。这可确保您的数据插入完全发生或根本不发生。参见 the documentation举个例子。
当你插入大量数据时,你会发现WAL mode性能更高。
关于python - APSW(或 SQLite3)在 executemany 上插入非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35013453/