SQLite:结束交易花费的时间太长了

时间:2012-04-18 12:32:41

标签: database sqlite transactions

我在事务中插入几行。但是,当我进行'结束交易'时,执行约250ms,而'BEGIN TRANSACTION'几乎不需要1ms。我需要在这里加快速度以适应我的应用程序。我怎么能?

[编辑] *单个线程正在访问数据库。 *我在这个数据库中有2个表,这两个表都有主键。 *在事务中,每个表中只有一个插入。 * OS - Windows 7

1 个答案:

答案 0 :(得分:7)

使用开箱即用或默认设置的sqlite,250ms来提交事务是有道理的。这是由于sqlite如何提交您的交易。它等待VFS保证写入被提交到磁盘返回。

以下是优化的几种可能性。

每个事务封装更多插入

如果可能,请为每个事务执行更多插入。尝试在一次交易中运行100个插入,并看看与仅1次插入相比差别不大。您甚至可能看不到任何内容(即100个插入内容可能略微超过250毫秒)。

最重要的是,你会得到更多的回报,因为每次插入最终会花费更少的时间(平均而言)。

使用WAL日记

我强烈建议您尝试WAL日记,因为您应该看到从250毫秒大幅减少。 WAL不应该比常规日记更安全。 WAL更快的原因在于它的名称:它附加到日志文件,而不是每次提交时数据库文件都会吸收提交的更改。阅读this了解完整故事。

要激活WAL日记功能,请将journal_mode pragma设置为WAL

PRAGMA journal_mode = WAL;

更改同步编译指示

这可能对您不够好,也可能不够好,因为它不太安全。因此,我建议只有当您了解风险是什么时,以及之前的两个建议是否对您不够好,或者您是否不能使用它们。

基本上,将synchronous pragma更改为NORMAL或OFF会导致sqlite在VFS之后不等待,以保证写入提交到磁盘返回。

请先阅读documentation,然后如果您还想尝试,可以将您的编译指示设置为OFF或NORMAL:

PRAGMA synchronous = NORMAL;

PRAGMA synchronous = OFF;