我应该如何调整SQLite以获得最小延迟?

时间:2017-02-26 00:01:55

标签: c sqlite

我已经读过SQLite针对使用默认设置的吞吐量进行了优化。调整SQLite的最佳方法是什么,而不是最小(并且是可预测的)可预测的写入延迟?我希望在所有情况下都能将简单更新+提交的延迟保持在10毫秒以下。

我想我需要在另一个线程上使用WAL和checkpoint,但我不确定检查点是否会阻塞主线程上的编写器。

我的应用程序一次只能访问数据库,因此无需担心并发问题。重要的是数据库没有损坏,但耐用性并不重要(最近的事务可能会丢失)。

1 个答案:

答案 0 :(得分:1)

获得写入低延迟的唯一方法是异步执行它们,即不要等待它们从缓存中刷新。

WAL documentation说明了这一点:

  

请注意,在PRAGMA synchronous设置为NORMAL的情况下,检查点是发出I / O屏障或同步操作的唯一操作(Windows上的unix或FlushFileBuffers()上的fsync())。因此,如果应用程序在单独的线程或进程中运行检查点,则执行数据库查询和更新的主线程或进程将永远不会阻止同步操作。这有助于防止在繁忙的磁盘驱动器上运行的应用程序中出现“闩锁”。此配置的缺点是事务不再持久,并且可能在电源故障或硬重置后回滚。

要防止主线程中发生检查点,请使用PRAGMA wal_autocheckpoint

但是这仍然会引入延迟,因为检查点必须在检查点操作期间锁定整个数据库。如果你不能忍受这种情况,那么当你负担得起时,将检查点移动到一些空闲时间,或者允许WAL文件增长到无限大。