On 4/14/05, [EMAIL PROTECTED]
<[EMAIL PROTECTED]> wrote:

> EXPLAIN is your friend.  As can be seen by EXPLAINing each query (see below),
> there are fewer instructions involved in the one with the subquery, and no
> sorts or loops as are done in the initial method.

Well, not everybody is a specialist on SQLite bytecode, I guess. It
looks a lot like RISC code to me, which means that it is mostly
illegible :-)

Anyway, I have compared statements with identical functions, and my
result is rather different. I don't know about loops, and I can't do a
real performance test at the moment, but at least the bytecode is a
lot longer for the subquery (as I would expect). I did:

sqlite> CREATE TABLE test (id INTEGER, addr CHAR(10), rest CHAR(20));
sqlite> CREATE INDEX testindex ON test (addr,id);
sqlite> EXPLAIN SELECT rest FROM test WHERE id>100 AND addr='1234'
ORDER BY id LIMIT 1;
...
39
sqlite> EXPLAIN SELECT rest FROM test WHERE id=(SELECT min(id) FROM
test WHERE id>100 AND addr='1234') AND addr='1234';
...
72

So which one is more efficient? Adding LIMIT 1 to the second one adds
5 more bytecodes (weird?).

That having said SQLite seems to match the performance of MySQL pretty
well in this task. I am positively surprised.

Thomas

 (Note that I've changed the
> maximum value to what fits in a signed 32-bit field since I'm doing this with
> 2.8.16.  You could try a similar experiment with 3.0.x.  Actually, it looks
> like you don't even need the WHERE clause in the original query, and I've
> tested that modification at the end of the EXPLAINation below, as well.
>
> > What if id is not unique, and I may have rows with identical id?
>
> The original poster had 'id' as INTEGER PRIMARY KEY so that wouldn't be
> possible.  If it is possible, then you'd have to decide what you wanted to do
> with multiple results.
>
>     % sqlite :memory:
>     SQLite version 2.8.16
>     Enter ".help" for instructions
>     sqlite> CREATE TABLE Mactor
>        ...> (
>        ...>   id INTEGER PRIMARY KEY,
>        ...>   name TEXT,
>        ...>   -- any other fields
>        ...>   comment TEXT
>        ...> );
>     sqlite> explain SELECT * FROM Mactor WHERE id < 2147483647 ORDER BY id 
> DESC LIMIT 1;
>     addr|opcode|p1|p2|p3
>     0|ColumnName|0|0|id
>     1|ColumnName|1|0|name
>     2|ColumnName|2|1|comment
>     3|Integer|-1|0|
>     4|MemStore|0|1|
>     5|ColumnName|3|0|INTEGER
>     6|ColumnName|4|0|TEXT
>     7|ColumnName|5|0|TEXT
>     8|Integer|0|0|
>     9|OpenRead|0|3|Mactor
>     10|VerifyCookie|0|31|
>     11|Rewind|0|25|
>     12|Integer|2147483647|0|2147483647
>     13|MemStore|1|1|
>     14|Recno|0|0|
>     15|MemLoad|1|0|
>     16|Ge|0|25|
>     17|Recno|0|0|
>     18|Column|0|1|
>     19|Column|0|2|
>     20|SortMakeRec|3|0|
>     21|Recno|0|0|
>     22|SortMakeKey|1|0|-
>     23|SortPut|0|0|
>     24|Next|0|14|
>     25|Close|0|0|
>     26|Sort|0|0|
>     27|SortNext|0|32|
>     28|MemIncr|0|31|
>     29|SortCallback|3|0|
>     30|Goto|0|27|
>     31|Pop|1|0|
>     32|SortReset|0|0|
>     33|Halt|0|0|
>     sqlite> explain SELECT * from Mactor WHERE id = (SELECT MAX(id) FROM 
> Mactor);
>     addr|opcode|p1|p2|p3
>     0|VerifyCookie|0|31|
>     1|Integer|0|0|
>     2|OpenRead|1|3|Mactor
>     3|Last|1|0|
>     4|Recno|1|0|
>     5|MemStore|0|1|
>     6|Goto|0|7|
>     7|Close|1|0|
>     8|ColumnName|0|0|id
>     9|ColumnName|1|0|name
>     10|ColumnName|2|1|comment
>     11|ColumnName|3|0|INTEGER
>     12|ColumnName|4|0|TEXT
>     13|ColumnName|5|0|TEXT
>     14|Integer|0|0|
>     15|OpenRead|0|3|Mactor
>     16|MemLoad|0|0|
>     17|MustBeInt|1|23|
>     18|NotExists|0|23|
>     19|Recno|0|0|
>     20|Column|0|1|
>     21|Column|0|2|
>     22|Callback|3|0|
>     23|Close|0|0|
>     24|Halt|0|0|
>     sqlite>explain SELECT * FROM Mactor ORDER BY id DESC LIMIT 1;
>     addr|opcode|p1|p2|p3
>     0|ColumnName|0|0|id
>     1|ColumnName|1|0|name
>     2|ColumnName|2|1|comment
>     3|Integer|-1|0|
>     4|MemStore|0|1|
>     5|ColumnName|3|0|INTEGER
>     6|ColumnName|4|0|TEXT
>     7|ColumnName|5|0|TEXT
>     8|Integer|0|0|
>     9|OpenRead|0|3|Mactor
>     10|VerifyCookie|0|31|
>     11|Rewind|0|20|
>     12|Recno|0|0|
>     13|Column|0|1|
>     14|Column|0|2|
>     15|SortMakeRec|3|0|
>     16|Recno|0|0|
>     17|SortMakeKey|1|0|-
>     18|SortPut|0|0|
>     19|Next|0|12|
>     20|Close|0|0|
>     21|Sort|0|0|
>     22|SortNext|0|27|
>     23|MemIncr|0|26|
>     24|SortCallback|3|0|
>     25|Goto|0|22|
>     26|Pop|1|0|
>     27|SortReset|0|0|
>     28|Halt|0|0|
>     sqlite>
>

Reply via email to