Restore
為什麼 sqlite3 .dump 和還原會導致更小的數據庫文件大小?
我對數據庫文件大小有一個非常幼稚的問題。我從一個 1.2M 的 SQLite 數據庫開始,將其轉儲到 SQL 文件,然後將其恢復到新數據庫。恢復的數據庫文件只有 50K。這是我的會話的樣子:
$ ls -lh total 1.2M -rw-r--r-- 1 user group 1.2M Jul 6 18:37 db.sqlite $ sqlite3 db.sqlite .dump > db.sql $ ls -lh total 1.2M -rw-r--r-- 1 user group 16K Jul 6 18:38 db.sql -rw-r--r-- 1 user group 1.2M Jul 6 18:37 db.sqlite $ cat db.sql | sqlite3 db-restored.sqlite $ ls -lh total 1.3M -rw-r--r-- 1 user group 50K Jul 6 18:38 db-restored.sqlite -rw-r--r-- 1 user group 16K Jul 6 18:38 db.sql -rw-r--r-- 1 user group 1.2M Jul 6 18:37 db.sqlite
為什麼恢復的文件比原來的小很多?
使用預設設置,當行(或整個表)被刪除時,SQLite 不會從數據庫文件中刪除空頁。(可以使用PRAGMA auto_vacuum更改此設置。)
在大多數情況下,在數據庫文件中保留空頁面是個好主意,因為它們將被稍後插入的新行重用,並且調整數據庫文件以刪除這些頁面,只是稍後重新分配它們,這將是不必要的成本。