4

我在事务中插入几行。但是当我执行“END TRANSACTION”时,它需要大约 250 毫秒来执行,而“BEGIN TRANSACTION”几乎不需要大约 1 毫秒。我需要在这里加快速度以适应我的应用程序。我怎样才能?

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

4

1 回答 1

7

使用 sqlite 的开箱即用或默认设置,250 毫秒提交事务是有意义的。这是由于 sqlite 如何提交您的事务。它等待 VFS 保证写入已提交到磁盘以返回。

这里有几个优化的可能性。

每个事务封装更多插入

如果可能,每个事务执行更多的插入。尝试在一个事务中运行 100 次插入,看看与仅 1 次插入相比差异有多大。您甚至可能看不到任何内容(即 100 次插入可能会花费超过 250 毫秒的时间)。

最重要的是,您将物有所值,因为每次插入最终将花费更少的时间(平均而言)。

使用 WAL 日志

我强烈建议您尝试 WAL 日志,因为您应该会看到 250 毫秒的显着减少。WAL 不应该比常规日志更安全。WAL 速度更快的原因在于它的名字:它附加到日志文件,而不是让数据库文件在每次提交时吸收提交的更改。阅读全文以获取完整故事。

要激活 WAL 日志,请将journal_modepragma 设置为WAL

PRAGMA journal_mode = WAL;

更改同步编译指示

这对您来说可能不够好,也可能不够好,因为它不太安全。因此,只有在您了解风险是什么,并且如果前面的两个建议对您来说不够好,或者您无法使用它们时,我才会推荐它。

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

请先阅读文档,然后如果您仍想尝试,可以将您的 pragma 设置为 OFF 或 NORMAL:

PRAGMA synchronous = NORMAL;

或者

PRAGMA synchronous = OFF;
于 2012-04-18T13:39:53.383 回答