I use EXPLAIN and EXPLAIN QUERY PLAN as comments for each other. Selects requiring coroutines do tend to make it hard to read (but VDBE code is optimized to be fast to execute)
-----Ursprüngliche Nachricht----- Von: Dave Baggett [mailto:[email protected]] Gesendet: Montag, 17. Februar 2014 18:00 An: [email protected] Betreff: [sqlite] EXPLAIN output; profiling index usage; LMDB backend I've been using SQLite very heavily for about a year now via Python and Roger Binns' APSW and have a few questions/suggestions about this incredibly awesome piece of code. Please take these in the positive spirit intended. 1) EXPLAIN output is rather hard to understand. Is there a way to produce annotated output that's more human-readable? I see that each opcode is extensively documented in the source; perhaps if the EXPLAIN output could be enhanced to include some of the commentary, or a higher-level syntax rather than VBDE opcodes? 2) Likewise, EXPLAIN QUERY PLAN could be annotated further. For example, "1|0|0|USE TEMP B-TREE FOR ORDER BY" could tell me what's being ordered; hints about what the relevant tables/columns are. 3) The profiling capabilities offered via xProfile are incredibly helpful for finding hot spots. One thing I've done that makes this even more useful is to "genericize" the SQL query text by replacing numbers, dates, etc. with placeholder symbols (e.g,. #) and then aggregating the results to produce a top 100 list by time used. Genericizing is simple pattern matching, and helps coalesce queries that would otherwise appear to be unrelated by simple identity. 4) Re: profiling, it would be great to know which indices are actually being used so that one could prune useless ones. Furthermore, it would be extremely valuable to know which indices are most expensive to maintain — i.e., which cause writing to become disproportionately expensive. Likewise, expensive TRIGGERS would be nice to know about, independently of the SQL queries that triggered them. 5) I've seeen that Howard Chu ported SQLite 3.7 to his LMDB B-Tree implementation and saw performance improvements. Is there a reason this isn't being mainlined? I assume there are trade-offs involved? For purely read-only databases, it would be nice to be able to select the LMDB back-end. (I realize making this switchable is a big undertaking; it's just a suggestion.) 6) Anecdotally, I've found it difficult to make sense of all the tuning parameters and achieve good performance. The settings required seem rather different for Windows than OS X, and for a while I was using fullfsync under OS X — thinking it was the recommended safe option — only to find a comment from DRH that it's not recommended, and not even used by Apple (who asked for it). And, indeed, without it writes are 10x faster! I guess my suggestion would be to update the various tuning documents to reflect the current state of things — even it's something along the lines of "top 10 tuning suggestions for {Windows, OSX, Android, iOS, Ubuntu}" or something like that. 7) I find it very useful to keep SQLite's heap separated from the Python heap so I can see who's using memory. I've patched my SQLite source to allow forcing this behavior even when there are multiple cores, and it seems to work fine. I suggest making this a mainlined compile-time option; it's a trivial patch. I only do this under OS X, because that's my primary development platform; I don't know if other platforms let you tag heaps the way OS X does. 8) The virtual table mechanism is incredibly powerful; I've used it to speed up performance-critical operations immensely. (This is a shout-out rather than a suggestion.) Thanks for an amazing piece of software. Dave _______________________________________________ sqlite-users mailing list [email protected] http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users ----------------------------------------------------------------------- Gunter Hick Software Engineer Scientific Games International GmbH Klitschgasse 2 – 4, A - 1130 Vienna, Austria FN 157284 a, HG Wien Tel: +43 1 80100 0 E-Mail: [email protected] This e-mail is confidential and may well also be legally privileged. If you have received it in error, you are on notice as to its status and accordingly please notify us immediately by reply e-mail and then delete this message from your system. Please do not copy it or use it for any purposes, or disclose its contents to any person as to do so could be a breach of confidence. Thank you for your cooperation. _______________________________________________ sqlite-users mailing list [email protected] http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

