在iOS中使用SQLite PRAGMA synchronous = OFF和journal_mode = MEMORY进行更新的最坏情况行为

时间:2015-09-02 02:50:36

标签: ios database performance sqlite pragma

通过同时使用synchronous = OFF和journal_mode = MEMORY选项,我可以将更新速度从15毫秒降低到大约2毫秒,这是一项重大的性能改进。这些更新一次发生一次,因此许多其他优化(例如使用有关它们的事务)不适用。

根据SQLite文档,数据库可能会损坏'在最坏的情况下,如果有某种类型的停电。然而,可能发生的最糟糕的事情是数据丢失,或者可能丢失一部分交易(我猜这是一种腐败形式)。这些选项中是否真的可能发生任意腐败?如果是这样,为什么?

我没有使用任何交易,因此交易中部分写入的数据不是问题,我可以在蓝月亮处理一次丢失的数据。但是,如果“腐败”#39;意味着DB中的所有数据都可以以不可预测的方式随机更改,这是不使用这些选项的有力理由。

有没有人知道iOS上真正的最坏情况会是什么?

1 个答案:

答案 0 :(得分:1)

表格被组织为B树,其中rowid为关键字。 如果在SQLite更新树结构时某些写入丢失,则整个表可能变得不可读。 (索引也会发生同样的情况,但可以简单地删除和重新创建索引。)

数据以页面形式组织(通常为1 KB或4 KB)。如果在重组某个树时某些页面更新丢失,则这些页面中的所有数据(即表中的某些随机行(附近有rowid值)可能会被破坏。

如果SQLite需要分配一个新页面,并且该页面包含合理的数据(例如,从同一个表中删除的数据),并且该页面的写入丢失,那么表中的数据不正确,没有该能力检测它。