2009-05-05 114 views
1

有没有办法预先分配我的SQLite数据库到一定大小?目前我正在添加和删除一些记录,并希望在创建时避免这种情况。SQLite - 预分配数据库大小

+3

为什么你认为有一个你可以避免的开销。如果可以的话,它对你的应用程序甚至有影响吗?我认为你正在试图做“不成熟的优化”http://en.wikipedia.org/wiki/Optimization_(computer_science),我们从Donald Knuth那里了解到“我们应该忘记小效率,大约97%的时间:过早优化是万恶之源。“ – lothar 2009-05-05 22:06:12

+1

有一个合理的需要做到这一点,不与效率挂钩。 [某些文件系统](http://blogs.technet.com/b/mikelag/archive/2011/02/09/how-fragmentation-on-incorrectly-formatted-ntfs-volumes-affects-exchange。aspx)对文件可以有多少片段有限制。如果你知道你的数据库有多大,你可以通过预先分配文件来避免这个问题。 – 2011-06-23 15:16:14

回答

2

存在一种破解 - 将一堆数据插入数据库,直到数据库大小达到您想要的数值,然后删除数据。这样做是因为:

“当一个对象(表,索引,或 触发)从数据库中删除, 会留下空白空间,这 空的空间将在下 一次新的信息被重复使用。添加到 数据库,但与此同时, 数据库文件可能大于 严格必要。“

当然,这不是最可靠的方法。 (另外,您需要确保auto_vacuum已被禁用才能使用)。你可以在这里了解更多 - http://www.sqlite.org/lang_vacuum.html

+0

正如我在我的问题中所说,这是我目前正在做的。但是,感谢auto_vacuum提示! – paul 2009-05-05 22:39:41

5

要做到这一点,最快的方式是与zero_blob功能:

例子:

Y:>sqlite3的large.sqlite
SQLite的3.7版。 4
输入“.help”作为指令
输入以“;”结尾的SQL语句
sqlite>创建表大(a);
sqlite>插入大数值(zeroblob(1024 * 1024));
sqlite>drop table large;
sqlite的>.Q

Y:>DIR large.sqlite
驱动器风量y是个人
卷序列号是365D-6110

的Y目录:\

01/27/2011 12:10 PM 1,054,720 large.sqlite


注意:由于Kyle在他的评论中正确地指出:

每个blob的大小都有限制,所以如果您希望数据库大于〜1GB,您可能需要插入多个blob。