Has anyone experienced the following:<br><br>*** Original question was sent to Ian Eslick as follows:<br><br>I noticed when I add and remove an item from a btree, the size of database always increases.  Is this the expected behavior?  I wrote a simple example below to illustrate what I'm seeing:<br>
<br>(in-package :cl-user)<br><br>(defpackage :test-elephant<br>  (:use :common-lisp))<br><br>(in-package :test-elephant)<br><br>(require :elephant)<br><br>(defvar *store-spec* '(:clsql (:sqlite3 "/Users/afeng/tmp/test.db")))<br>
<br>(ele:defpclass test ()<br>  ((name :initarg :name<br>     :Accessor name)))<br><br>(ele:with-open-store (*store-spec*)<br>  (loop for i from 1 to 100 do<br>       (ele:add-to-root "aaron" (make-instance 'test :name "aaron"))<br>
       (ele:remove-from-root "aaron")<br>       (ele:root-existsp "aaron")))<br><br>*** end of question<br><br>*** Ian's reply:<br><br>Databases are allocated in pages.  When a page becomes free, the disk space for that page isn't reclaimed, but instead reused in future page allocations.  The only way to recover all the empty disk space is to migrate to a new store and delete the old one.  This effectively compacts the DB.<br>
<br>Elephant does not actually manage the page allocation - that's all being done by the underlying data store (i.e. SQLITE).<br><br>You might look for more information on SQLITE's allocation policy.  One thing to consider is that each add/delete operation is stored in a transaction log file.  Until the DB is checkpointed, the transaction history is maintained on disk for future recovery, so there is some linear growth in storage.  BDB separates DB storage from log files, I think SQLite puts them all in the same file.<br>
<br>**** end of reply<br><br>If theory is correct, executing the loop more than once should cause the database size to stay relatively the same after the first run.  However, each time I re-execute the loop, the size always increase by a good factor.  I do not think it's the transaction log file because of the increment amount seemed large.  I also tried to insert and delete directly in the database, this method does seem to re-use already allocated pages.  Am I doing something wrong?<br>
<br>Thanks,<br><br>Aaron<br>