我有一个空的100 MB Sqlite文件,根据我真空吸尘器的Sqlite版本,它会创建一个4k或100 MB的日志文件(我用inotifywait
拦截了创建,并链接到它我能看到它)。这两种日记帐模式都是delete
。
在release log中,我只能找到one hint关于可能导致更改的真空优化,但我无法确定是否是原因。
无论如何,为什么任何版本的Sqlite都会创建一个100 MB的日志来使用一个空的表来清空一个100 MB的Sqlite文件?
版本:
编辑:
这是我捕获任何已创建文件的方式:
for fil in $(inotifywait -e create . |awk '{ print $3 }'); do ln $fil $fil-linked; done
使用较新的版本,只制作4k日志,没有别的。
编辑2:
对真空的困惑正在增加。手册指出:" VACUUM命令的工作原理是将数据库的内容复制到临时数据库文件中,然后用临时文件的内容覆盖原始文件。"。但是,当我使用inotifywait -m .
时,我看不到。我所看到的只是一个空数据库和一个数据:
./ ACCESS testdb.sqlite3
./ ACCESS testdb.sqlite3
./ ACCESS testdb.sqlite3
./ ACCESS testdb.sqlite3
./ CREATE testdb.sqlite3-journal
./ OPEN testdb.sqlite3-journal
./ MODIFY testdb.sqlite3-journal
./ MODIFY testdb.sqlite3-journal
./ MODIFY testdb.sqlite3-journal
./ MODIFY testdb.sqlite3-journal
./ MODIFY testdb.sqlite3-journal
./ MODIFY testdb.sqlite3-journal
./ MODIFY testdb.sqlite3-journal
./ OPEN,ISDIR
./ CLOSE_NOWRITE,CLOSE,ISDIR
./ MODIFY testdb.sqlite3-journal
./ MODIFY testdb.sqlite3
./ CLOSE_WRITE,CLOSE testdb.sqlite3-journal
./ DELETE testdb.sqlite3-journal
没有日记:
./ ACCESS testdb.sqlite3
./ MODIFY testdb.sqlite3
答案 0 :(得分:0)
VACUUM操作会创建数据库的临时副本,然后需要带有回滚日志的事务才能写入实际数据库。 (即使在空数据库中,如果启用了secure_delete,也必须覆盖所有空白空间,这可能必须回滚。)因此,在最坏的情况下,它可能需要额外200%的存储空间。
不应该经常吸尘,所以它并不总是非常优化。