[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Monotone-devel] Re: Monotone speedup by adding additional database indi
From: |
Lapo Luchini |
Subject: |
[Monotone-devel] Re: Monotone speedup by adding additional database indices? |
Date: |
Thu, 11 Oct 2007 23:46:33 +0200 |
User-agent: |
Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8.1.6) Gecko/20070728 Thunderbird/2.0.0.6 Mnenhy/0.7.4.0 |
Markus Schiltknecht wrote:
>> ! 2|OpenRead|1|28|keyinfo(5,BINARY,BINARY)
>> ! 2|OpenRead|1|39|keyinfo(3,BINARY,BINARY)
> I'm not an expert reading these plans, but for sure both variants use an
> index scan and not a sequential scan.
Those are the "key rows" to understand which index is being used.
Unfortunately I didn't yet manage to understand how to know WHAT index
is the number referring to, but I guess this should mean, respectively:
- use index 28, bind two columns with binary affinity
- use index 39, bind two columns with binary affinity
(what about the 5 and 3? dunno)
...so even if the rest of the code is almost identical, the index used
is different, and the column that is search vs scanned is reversed.
Which does all the difference here.
In fact it confirms that with "standard 0.36 schema" the WRONG index is
used: the fact that it is binded with TWO values is quite telling.
% sqlite3 0.36.mtn
sqlite> .explain on
sqlite> EXPLAIN SELECT id, name, value FROM revision_certs WHERE id =
'abc' AND name = 'def' AND value = 'ghi';
addr opcode p1 p2 p3
---- -------------- ---------- ---------- -----------------------
0 Goto 0 22
1 Integer 0 0
2 OpenRead 1 13 keyinfo(5,BINARY,BINARY)
3 SetNumColumns 1 6
4 String8 0 0 def
[...]
sqlite> EXPLAIN SELECT id, name, value FROM revision_certs WHERE id =
'abc' AND +name = 'def' AND value = 'ghi';
addr opcode p1 p2 p3
---- -------------- ---------- ---------- -----------------------
0 Goto 0 29
1 Integer 0 0
2 OpenRead 0 11
3 SetNumColumns 0 4
4 Integer 0 0
5 OpenRead 1 38 keyinfo(1,BINARY)
6 String8 0 0 abc
[...]
The second query is using "+name" to be sure the (name, value) index
won't be used, and in fact the OpenRead binds a different index and with
only one value, which is id='abc'.
sqlite> DROP INDEX revision_certs__id;
sqlite> CREATE INDEX revision_certs__id_name_value ON revision_certs
(id, name, value);
sqlite> vacuum;
sqlite> analyze;
sqlite> .explain off
sqlite> SELECT name, rootpage FROM sqlite_master WHERE type = 'index'
AND tbl_name = 'revision_certs';
[...]
revision_certs__name_value|38
revision_certs__id_name_value|40
sqlite> .explain on
sqlite> EXPLAIN SELECT id, name, value FROM revision_certs WHERE id =
'abc' AND name = 'def' AND value = 'ghi';
addr opcode p1 p2 p3
---- -------------- ---------- ---------- -------------------------
0 Goto 0 22
1 Integer 0 0
2 OpenRead 1 40 keyinfo(3,BINARY,BINARY)
...and 40 is indeed the rootpage of the new index.
(some kind of auto-resolve rootpage->name of index/table would be NICE
on sqlite-client side, tough :P)
- Re: [Monotone-devel] Monotone speedup by adding additional database indices?, (continued)
Re: [Monotone-devel] Monotone speedup by adding additional database indices?, Nathaniel Smith, 2007/10/11
[Monotone-devel] Re: Monotone speedup by adding additional database indices?, Lapo Luchini, 2007/10/11