But in my example there are multiple rows which satisfy the condition.
My example:
sql="create table em(name int primary key,age int);"\
"create table idv(id int primary key,name text);"\
"create table mny(id int primary key,sal int);"\
"create table lo(name int primary key,addr text);";
sql="insert into em values(44,21);"\
"insert into em values(11,20);"\
"insert into em values(5,20);"\
"insert into idv values(11,44);"\
"insert into idv values(5,11);"\
"insert into idv values(44,180);"\
"insert into mny values(5,10000);"\
"insert into mny values(11,5000);"\
"insert into mny values(44,5000);"\
"insert into lo values(5,'NY');"\
"insert into lo values(44,'che');"\
"insert into lo values(11,'NY');";
sql="select * from em,lo,mny,idv where lo.name=em.name and idv.id=mny.id ";
VDBE:
0 Init 0 41 0 00
1 OpenRead 0 2 0 2 00
2 OpenRead 1 9 0 2 00
3 OpenRead 4 10 0 k(2,nil,nil) 00
4 OpenRead 2 7 0 2 00
5 OpenRead 3 5 0 2 00
6 OpenRead 5 6 0 k(2,nil,nil) 00
7 Rewind 0 34 0 00
8 Column 0 0 1 00
9 IsNull 1 33 0 00
10 Affinity 1 1 0 D 00
11 SeekGE 4 33 1 1 00
12 IdxGT 4 33 1 1 00
13 IdxRowid 4 2 0 00
14 Seek 1 2 0 00
15 Rewind 2 33 0 00
16 Column 2 0 3 00
17 IsNull 3 32 0 00
18 Affinity 3 1 0 D 00
19 SeekGE 5 32 3 1 00
20 IdxGT 5 32 3 1 00
21 IdxRowid 5 4 0 00
22 Seek 3 4 0 00
23 Column 0 0 5 00
24 Column 0 1 6 00
25 Column 4 0 7 00
26 Column 1 1 8 00
27 Column 2 0 9 00
28 Column 2 1 10 00
29 Column 5 0 11 00
30 Column 3 1 12 00
31 ResultRow 5 8 0 00
32 Next 2 16 0 01
33 Next 0 8 0 01
34 Close 0 0 0 00
35 Close 1 0 0 00
36 Close 4 0 0 00
37 Close 2 0 0 00
38 Close 3 0 0 00
39 Close 5 0 0 00
40 Halt 0 0 0 00
41 Transaction 0 0 44729 0 01
42 TableLock 0 2 0 em 00
43 TableLock 0 9 0 lo 00
44 TableLock 0 7 0 mny 00
45 TableLock 0 5 0 idv 00
46 Goto 0 1 0 00
How sqlite works in this case ?
because there are 4 tables and for only 2 tables(or indices) it opened
loops ?
The next opcodes belongs to which tables in this case?
On Tue, Mar 17, 2015 at 5:47 PM, Hick Gunter <hick at scigames.at> wrote:
> If there can be not more than one row that satisfies the constraints (i.e.
> the constraints specifiy a unique key) and there is an index (express or
> implied or autocreated) available, then a simple index lookup will suffice.
>
> How many rows do you expect to have a rowid of 1?
> How many rows do you expect to read from table a for each row of table b
> if a_rowid is a foreign key?
>
> create temp table a (f1 integer);
> create temp table b (a_rowid integer, f2 integer);
>
> .explain
> explain select * from a where rowid = 1;
> addr opcode p1 p2 p3 p4 p5 comment
> ---- ------------- ---- ---- ---- ------------- -- -------------
> 0 Trace 0 0 0 00 NULL
> 1 Integer 1 1 0 00 NULL
> 2 Goto 0 10 0 00 NULL
> 3 OpenRead 0 2 1 1 00 a
> 4 MustBeInt 1 8 0 00 NULL
> 5 NotExists 0 8 1 00 pk
> 6 Column 0 0 3 00 a.f1
> 7 ResultRow 3 1 0 00 NULL
> 8 Close 0 0 0 00 NULL
> 9 Halt 0 0 0 00 NULL
> 10 Transaction 1 0 0 00 NULL
> 11 VerifyCookie 1 1 0 00 NULL
> 12 TableLock 1 2 0 a 00 NULL
> 13 Goto 0 3 0 00 NULL
>
> explain select * from a join b on a.rowid=b.a_rowid where b.f2 = 1;
> addr opcode p1 p2 p3 p4 p5 comment
> ---- ------------- ---- ---- ---- ------------- -- -------------
> 0 Trace 0 0 0 00 NULL
> 1 Integer 1 1 0 00 NULL
> 2 Goto 0 19 0 00 NULL
> 3 OpenRead 1 3 1 2 00 b
> 4 OpenRead 0 2 1 1 00 a
> 5 Rewind 1 16 0 00 NULL
> 6 Column 1 1 2 00 b.f2
> 7 Ne 1 15 2 collseq(BINARY) 6c NULL
> 8 Column 1 0 3 00 b.a_rowid
> 9 MustBeInt 3 15 0 00 NULL
> 10 NotExists 0 15 3 00 pk
> 11 Column 0 0 4 00 a.f1
> 12 Column 1 0 5 00 b.a_rowid
> 13 Column 1 1 6 00 b.f2
> 14 ResultRow 4 3 0 00 NULL
> 15 Next 1 6 0 01 NULL
> 16 Close 1 0 0 00 NULL
> 17 Close 0 0 0 00 NULL
> 18 Halt 0 0 0 00 NULL
> 19 Transaction 1 0 0 00 NULL
> 20 VerifyCookie 1 2 0 00 NULL
> 21 TableLock 1 3 0 b 00 NULL
> 22 TableLock 1 2 0 a 00 NULL
> 23 Goto 0 3 0 00 NULL
>
> -----Urspr?ngliche Nachricht-----
> Von: Sairam Gaddam [mailto:gaddamsairam at gmail.com]
> Gesendet: Dienstag, 17. M?rz 2015 12:26
> An: General Discussion of SQLite Database
> Betreff: [sqlite] regarding loops in vdbe code
>
> When joining a table in sqlite with some condition using where clause,
> sqlite sometimes generate less number of loops(Next opcodes) than the
> number of tables.
> Can anyone explain how sqlite iterates through all the tables when it has
> less number of loops.
> _______________________________________________
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>
>
> ___________________________________________
> Gunter Hick
> Software Engineer
> Scientific Games International GmbH
> FN 157284 a, HG Wien
> Klitschgasse 2-4, A-1130 Vienna, Austria
> Tel: +43 1 80100 0
> E-Mail: hick at scigames.at
>
> This communication (including any attachments) is intended for the use of
> the intended recipient(s) only and may contain information that is
> confidential, privileged or legally protected. Any unauthorized use or
> dissemination of this communication is strictly prohibited. If you have
> received this communication in error, please immediately notify the sender
> by return e-mail message and delete all copies of the original
> communication. Thank you for your cooperation.
>
>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>