我在事务中插入几行。但是当我执行“END TRANSACTION”时,它需要大约 250 毫秒来执行,而“BEGIN TRANSACTION”几乎不需要大约 1 毫秒。我需要在这里加快速度以适应我的应用程序。我怎样才能?
[编辑] * 单个线程正在访问数据库。* 我在这个数据库中有 2 个表,它们都有主键。* 在事务中,每个表中都有一个插入。* 操作系统 - Windows 7
我在事务中插入几行。但是当我执行“END TRANSACTION”时,它需要大约 250 毫秒来执行,而“BEGIN TRANSACTION”几乎不需要大约 1 毫秒。我需要在这里加快速度以适应我的应用程序。我怎样才能?
[编辑] * 单个线程正在访问数据库。* 我在这个数据库中有 2 个表,它们都有主键。* 在事务中,每个表中都有一个插入。* 操作系统 - Windows 7
使用 sqlite 的开箱即用或默认设置,250 毫秒提交事务是有意义的。这是由于 sqlite 如何提交您的事务。它等待 VFS 保证写入已提交到磁盘以返回。
这里有几个优化的可能性。
如果可能,每个事务执行更多的插入。尝试在一个事务中运行 100 次插入,看看与仅 1 次插入相比差异有多大。您甚至可能看不到任何内容(即 100 次插入可能会花费超过 250 毫秒的时间)。
最重要的是,您将物有所值,因为每次插入最终将花费更少的时间(平均而言)。
我强烈建议您尝试 WAL 日志,因为您应该会看到 250 毫秒的显着减少。WAL 不应该比常规日志更安全。WAL 速度更快的原因在于它的名字:它附加到日志文件,而不是让数据库文件在每次提交时吸收提交的更改。阅读全文以获取完整的故事。
要激活 WAL 日志,请将journal_mode
pragma 设置为WAL
:
PRAGMA journal_mode = WAL;
这对您来说可能不够好,也可能不够好,因为它不太安全。因此,只有在您了解风险是什么,并且如果前面的两个建议对您来说不够好,或者您无法使用它们时,我才会推荐它。
基本上,将其更改synchronous
pragma
为 NORMAL 或 OFF 将导致 sqlite 在 VFS 之后不等待以保证写入已提交到磁盘以返回。
请先阅读文档,然后如果您仍想尝试,可以将您的 pragma 设置为 OFF 或 NORMAL:
PRAGMA synchronous = NORMAL;
或者
PRAGMA synchronous = OFF;