omg*_*ggs 4 database sqlite transactions
我在事务中插入几行.但是,当我进行'结束交易'时,执行约250ms,而'BEGIN TRANSACTION'几乎不需要1ms.我需要在这里加快速度以适应我的应用程序.我怎么能够?
[edit]*单个线程正在访问数据库.*我在这个数据库中有2个表,这两个表都有主键.*在事务中,每个表中只有一个插入.*操作系统 - Windows 7
小智 7
使用开箱即用或默认设置的sqlite,250ms来提交事务是有道理的.这是由于sqlite如何提交您的交易.它等待VFS以保证写入提交到磁盘以返回.
以下是一些优化的可能性.
如果可能,请为每个事务执行更多插入.尝试在一次交易中运行100个插入,并看看与仅1次插入相比差别不大.您甚至可能看不到任何内容(即100个插入可能会略微超过250毫秒).
最重要的是,你会得到更多的回报,因为每个插入最终会花费更少的时间(平均).
我强烈建议您尝试WAL日记,因为您应该看到从250毫秒大幅减少.WAL不应该比常规日记更安全.WAL更快的原因在于它的名称:它附加到日志文件,而不是每次提交时数据库文件都会吸收提交的更改.阅读本文的全文.
要激活WAL日记功能,请将journal_modepragma 设置为WAL:
PRAGMA journal_mode = WAL;
Run Code Online (Sandbox Code Playgroud)
这可能对您不够好,也可能不够好,因为它不太安全.因此,我建议只有当您了解风险是什么时,以及前两个建议是否对您不够好,或者您是否不能使用它们.
基本上,synchronous pragma将更改为NORMAL或OFF将导致sqlite在VFS之后不等待,以保证写入提交到磁盘返回.
请先阅读文档,然后如果您仍想尝试,可以将您的编译指示设置为OFF或NORMAL:
PRAGMA synchronous = NORMAL;
Run Code Online (Sandbox Code Playgroud)
要么
PRAGMA synchronous = OFF;
Run Code Online (Sandbox Code Playgroud)