I see. Thanks for the detailed explanation! Given how expensive a full DB VACUUM can be (also seems impossible to determine how expensive without running VACUUM), could a table-level VACUUM make sense for this scenario? One could even make it a command as specific as CLEAR COLUMN, which has this side effect.
But actually, I think that what you're saying is that when setting the column to 0, if each row fits into a page, there's nothing to do. If there were spill pages being used by that row, then those will be recovered? If I understand correctly then, the only benefit is recovering those spill pages if possible, and that will already happen by 0'ing the column if possible. If that's the case, I think I can be happy that some space will be recovered if possible, short of doing the full VACUUM. Ben On Sat, Jun 9, 2018 at 10:17 AM Jay Kreibich <j...@kreibi.ch> wrote: > > > On Jun 9, 2018, at 10:04 AM, Ben Asher <benashe...@gmail.com> wrote: > > > > Right we'll prefer NULL, but some columns are NON NULL. In this scenario, > > we're not worried about returning space to the OS, but good point out > > VACUUM. Thanks! > > Without digging through some detailed docs, I’m pretty sure empty string > and NULL require the same amount of storage space. If not, the difference > is maybe one byte. > > As for freeing the pages, the issue is that row values are stored in leaf > pages, kind of like a big array or list, packed together— not only are the > values in a row packed, the rows themselves are them packed into pages. If > you just set existing column value to NULL (or empty string) it is going to > re-pack and re-write the values in that page, but it isn’t going to > globally recover the space used by that column because it is intermixed > with all the other columns. The only case when a single column change > would trigger page recovery is if the value in that column is so big the > row overflows a single page and requires spill pages. Since a column clear > generally won’t free whole pages, there is nothing to put on the free list. > > The point of the VACUUM is not to release free pages back to the OS, but > to force the database to re-write (and therefore re-pack) all the rows, so > that the whole table will require fewer pages, and whatever is left over > can be freed (or in the case of a VACUUM, never re-written). > > It is different when you delete rows, since the the whole row record is > deleted and it tends to free up bigger chunks. But clearing the data out > of a column only clears values in the middle of row records, so it is > unlikely to free up pages by itself. > > -j > > > > > Ben > > > > On Sat, Jun 9, 2018 at 10:01 AM Jay Kreibich <j...@kreibi.ch> wrote: > > > >> > >>> On Jun 9, 2018, at 9:52 AM, Ben Asher <benashe...@gmail.com> wrote: > >>> > >>> Hi! I've read a lot of discussion about the constraints related to why > >>> SQLite doesn't have destructive column commands (MODIFY, RENAME, DROP, > >>> etc.). Despite that, we still have situations where our data model > >> changes, > >>> and a column becomes obsolete. Given the constraints, we've decided to > >>> create a column "graveyard" at the application level: basically a list > of > >>> columns that exist but are obsolete. While we cannot drop columns, we > >> would > >>> like to make sure that the space occupied by the columns contents is > >> zeroed > >>> and returned to SQLite's free list ( > https://www.sqlite.org/faq.html#q12) > >> to > >>> be re-used. Is setting the column's contents to "" (for a TEXT column > >>> specifically) sufficient to do that? > >> > >> That or NULL. You also have to vacuum the database to re-pack the > >> database pages and actually recover the disk space. Some of the space > may > >> be recovered if the TEXT records were really long (and required spill > >> pages) but if most of the column were a dozen bytes or so (more typical) > >> you’ll want to do a VACUUM. > >> > >> -j > >> > >> _______________________________________________ > >> sqlite-users mailing list > >> sqlite-users@mailinglists.sqlite.org > >> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > >> > > > > > > -- > > Ben > > _______________________________________________ > > sqlite-users mailing list > > sqlite-users@mailinglists.sqlite.org > > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > > _______________________________________________ > sqlite-users mailing list > sqlite-users@mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > -- Ben _______________________________________________ sqlite-users mailing list sqlite-users@mailinglists.sqlite.org http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users