SQLite - 预分配数据库大小

6

有没有一种方法可以预先分配SQLite数据库的特定大小?目前,我正在添加和删除大量记录,并希望在创建时避免这种开销。


3
你为什么认为有一些开销是可以避免的呢?如果你能够避免这些开销,对你的应用程序是否真的重要呢?我认为你正试图进行“过早优化”,而根据Donald Knuth的学说,“我们在大多数情况下都应该忘记小的效率问题:过早的优化是万恶之源。”请参考:http://en.wikipedia.org/wiki/Optimization_(computer_science) - lothar
3
有一种合法的需求需要这样做,与效率无关。某些文件系统对文件可以存在的片段数目有限制。如果你知道数据库将会有多大,可以通过预先分配文件来避免这个问题。 - Kyle Krull
2个回答

9

最快的方法是使用zero_blob函数:

示例:

Y:> sqlite3 large.sqlite
SQLite版本3.7.4
输入“.help”获取说明
输入以“;”终止的SQL语句
sqlite>创建表large(a);
sqlite>插入零blob(1024 * 1024)的值;
sqlite>删除表large;
sqlite>.q

Y:> dir large.sqlite
驱动器Y中的卷是Personal
卷的序列号是365D-6110

Y:\的目录

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


注意:正如Kyle在评论中所指出的:

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


1
请注意,每个blob的大小都有限制(http://www.sqlite.org/limits.html),因此如果您希望数据库大于约1GB,则可能需要插入多个blob。 - Kyle Krull
@Kyle:好观点,我已经更新了答案,包括那个信息。 - Noah

3
有一种黑客方法 - 将大量数据插入数据库直到数据库大小达到您想要的大小,然后再删除这些数据。这种方法有效是因为:
“当从数据库中删除对象(表、索引或触发器)时,它会留下空间。这个空间将在下次向数据库添加新信息时被重复使用。但同时,数据库文件可能比严格必要的更大。”
当然,这并不是最可靠的方法。(此外,您需要确保禁用自动清理才能使其工作)。您可以在这里了解更多信息 - http://www.sqlite.org/lang_vacuum.html

正如我在问题中所说的那样,这就是我目前正在做的。但感谢您提供的auto_vacuum提示! - paul
很高兴能够帮助。另一件有助于稍微提高SQLite数据库性能的事情是确保你对数据库文件进行碎片整理(特别是如果你正在使用Windows)。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接