SQLite中的碎片以循环方式使用而没有VACUUM

时间:2014-12-12 14:25:55

标签: sqlite sd-card premature-optimization

有一个SQLite数据库用于以循环方式存储静态大小的数据。

例如,存储了100天的数据。在第101天,删除第1天,然后插入第101天。

天数之间的行数相同。行中的各个字段都是整数(32位或更少)和时间戳。

数据库存储在I / O速度较差的SD卡上, 类似于30 MB / s的读取速度。

不允许使用VACUUM,因为它可能会引入几秒钟的等待 并且不允许该数据库的编写者等待写访问。

所以关注的是碎片,因为我不断地插入和删除记录 没有VACUUMing。 但是因为我每天都在删除/插入相同的行集, 数据是否会碎片化? SQLite是否适合第1天释放的第101天的数据?

虽然行集是一样的, 整数可以是1个字节,然后是4个字节。 数据库还有几个索引,我不确定它们的存储位置 如果它们干扰了释放页面的完美模式,然后重新使用它们。

(SQLite是唯一可以使用的技术。无法切换到TSDB / RRDtool等。)

1 个答案:

答案 0 :(得分:0)

SQLite将重用免费页面,因此您将获得碎片(如果您删除了大量数据以使整个页面免费)。

但是,SD卡很可能有一个闪存转换层,每当你写一些随机扇区时就会引入碎片。

第一种碎片是否明显取决于硬件和软件的访问模式。 对此无法做出有用的预测;你必须测量它。


理论上,WAL mode仅附加,因此在闪存设备上更容易。 但是,checkpoints几乎与VACUUM一样糟糕。