Thanks Jay I'm currently using an 8000 page cache, and as far as I know my DB should have been fully-cached before I created the indices (it was built from scratch and queried several times). Disk usage is pretty much as I expected. Does creating an index use extra pages on top of the fully-cached DB and the index representation itself? I'll have to read up on VACUUM...
Cheers, Dave. -----Original Message----- From: Jay A. Kreibich [mailto:[EMAIL PROTECTED] Sent: 27 August 2008 06:52 To: General Discussion of SQLite Database Subject: Re: [sqlite] Index memory usage in SQLite On Tue, Aug 26, 2008 at 06:13:29PM +0100, Dave Toll scratched on the wall: > I'm running some general performance tests on SQLite 3.5.9 (embedded C > platform), and I noticed that creating an index seems to use a lot more > memory than I expected. Creating an index requires reading and sorting the original table. It tends to beat the page cache fairly hard. This is a known condition. In fact, the first bit of advice to increase the speed of index creation is to make the page cache larger. > An index on an integer column (30495 rows) uses 1,011,560 bytes. > > DB file size increases by 311,296 bytes. Or about 10.2 bytes per item, which sounds pretty reasonable. An index in SQLite contains a full copy of the indexed data, so that plus a rowid reference back to the original table and other metadata makes 10 bytes sound about right, especially if most of the integers are smallish (SQLite uses var-length integers). > An index on a varchar column (average null-terminated text length 18 > bytes, 30495 rows) uses 2,180,040 bytes. > > DB file size increases by 856,064 bytes. Same thing. 28 bytes per item sounds reasonable, especially if the average data item is 18 bytes. Strings won't pack into pages quite as efficiently, so I'd expect a higher overhead. > I'm using the static memory allocator (mem3.c), page size 4096, and I > compiled with SQLITE_32BIT_ROWID. I measured the difference in memory > reported by sqlite3_memory_used(). > Dropping the index does not return any of the memory used, If you're measuring the process memory usage, that's normal. Free pages aren't returned to the OS. If you're measuring the allocator, chances are most of that memory is in the page cache, and will not be returned. The default page size is 1K and the default cache size is 2K with about 0.5K of overhead per page, meaning the default system expects about 3MB worth of cache. Neither of the examples you've given go over that, so unless you can figure out otherwise, I'd assume most of that is cache allocation. The cache will grow until it hits its max size but won't be returned. > and does not reduce the DB file size. That's normal. As with memory systems, free pages are not released unless you vacuum the database file. -j -- Jay A. Kreibich < J A Y @ K R E I B I.C H > "'People who live in bamboo houses should not throw pandas.' Jesus said that." - "The Ninja", www.AskANinja.com, "Special Delivery 10: Pop!Tech 2006" _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users