2009-05-05 65 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。