我正在开发一个用 C 编写的项目,该项目生成近 350k 的序列并保存在 sqlite 数据库中。对于每个序列,我必须在表中插入(或忽略)一个字符串,并更新其他表中的一行。
我尝试了这个“指南”,但无法达到每秒超过 30k 操作。
我正在使用每个 1M 操作的事务(插入和更新)并且 PRAGMA synchronous=OFF
我有什么选择来解决这个瓶颈?
实际上,SQLite 在普通台式计算机上每秒可以轻松执行 50,000 条或更多 INSERT 语句。但它每秒只能进行几十笔交易。交易速度受到磁盘驱动器转速的限制。一个事务通常需要磁盘盘片完整旋转两次,这在 7200RPM 磁盘驱动器上限制为每秒大约 60 个事务。
事务速度受到磁盘驱动器速度的限制,因为(默认情况下)SQLite 实际上会等到数据真正安全地存储在磁盘表面上才完成事务。这样,如果您突然断电或操作系统崩溃,您的数据仍然安全。有关详细信息,请阅读 SQLite 中的原子提交。
默认情况下,每个 INSERT 语句都是其自己的事务。但是,如果您用 BEGIN...COMMIT 包围多个 INSERT 语句,则所有插入都会分组到单个事务中。提交事务所需的时间分摊到所有包含的插入语句上,因此每个插入语句的时间大大减少。
另一个选项是运行 PRAGMA synchronous=OFF。该命令将导致 SQLite 不等待数据到达磁盘表面,这将使写入操作显得更快。但是,如果您在事务过程中断电,您的数据库文件可能会损坏。
请查看此常见问题解答,它解释了插入瓶颈问题等。
| 归档时间: |
|
| 查看次数: |
1164 次 |
| 最近记录: |