0

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

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

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

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

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

所以问题是碎片化,因为我在没有 VACUUMing 的情况下不断地插入和删除记录。但是由于我每天都在删除/插入同一组行,数据会变得支离破碎吗? SQLite 是否在第 1 天的释放页面中拟合第 101 天的数据?

尽管行集是相同的,但整数可能是 1 字节天,然后是 4 字节。该数据库还有几个索引,我不确定它们存储在哪里,以及它们是否会干扰释放页面然后重新使用它们的完美模式。

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

4

1 回答 1

0

SQLite 将重用空闲页面,因此您将获得碎片(如果您删除的数据太多以至于整个页面都变得空闲)。

但是,SD 卡可能有一个闪存转换层,每当您写入某个随机扇区时,它都会引入碎片。

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


理论上,WAL 模式是仅附加的,因此在闪存设备上更容易。然而,检查点几乎和 VACUUM 一样糟糕。

于 2014-12-15T14:20:29.887 回答