On Mon, 30 Aug 2010, Jay A. Kreibich wrote: > Date: Mon, 30 Aug 2010 12:04:25 -0500 > From: Jay A. Kreibich <j...@kreibi.ch> > To: General Discussion of SQLite Database <sqlite-users@sqlite.org> > Cc: r...@controlq.com > Subject: Re: [sqlite] Is there a design doc for the virtual machine re-write? > > On Mon, Aug 30, 2010 at 03:59:51PM +0400, Max Vlasov scratched on the wall: >>> That is *EXACTLY* what I'm reffering to. Is there any design info, >>> rationale or pointers to what changes were made, and why the switch from a >>> stack to register machine?? Also, is there any performance data? >> >> There's a video where D. Richard Hipp talks about sqlite (interesting in >> many other aspects also): >> http://video.google.com/videoplay?docid=-5160435487953918649 >> >> He mentioned (about 30:00) that with register based engine is much easier to >> generate instructions. > > There's also this comment, on a bug that was filed in November of > 2007 (less than 90 days before the release of the register based VDBE): > > http://www.sqlite.org/cvstrac/tktview?tn=2767,39 > > "I have long wanted to switch the VDBE from being a stack-based VM to > being a register based VM. Notice that were the VDBE register based, > this bug would have never come up...." > >> Below is my observations about the aspects that makes register-based engine >> a better choice: >> - vbe codes points to columns, tables and so on while actual data is placed >> in the tables (persistent or temporal) so there are actually not so many >> cases when you really need much data temporary available so several >> registers should be enough > > I think that's key. The SQLite VDBE is extremely specialized. Most of > the "instructions" are very high level abstractions. If you wanted > to write a procedural language for database manipulation, it isn't > difficult to imagine a nearly one-to-one mapping between PL/SQL like > commands and VDBE instructions. > > I've not spent a ton of time studying the VM, other than trying to > track down query performance issues, but in my own experience the > registers don't tend to carry values from instruction to instruction. > Frequently the registers have immediate values, and are used more as > instruction parameters, rather than state carrying containers that are > passed from instruction to instruction. As Max said, most of the > manipulated data (i.e. database values and table or index references) > is held in non-register containers. The registers are used as index > references into those stores, and in many cases those index values are > static for a specific VM instruction in a specific VDBE program. > > Because of the nature of the SQL language, this works out very well. > SQL commands tend to be self-contained and follow specific formats. > I'm sure a "parameter based" VM makes code generation much simpler > and much faster and is a very good fit for the needs of SQLite. > I'm less convinced it could be expanded to deal with more generic > programming abstractions, such as recursive function calls-- but I > don't have an extensive amount of VM experience, so I wouldn't put > much into that opinion. > > -j
Thanks, Jay. I'll check the links, and look further afield for what I seek. I've been reviewing the Lua design doc recently, and the decision to move from a stack to a register based VM is well supported there. (http://www.lua.org/doc/jucs05.pdf) Cheers, Rob Sciuk. _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users