-----Urspr?ngliche Nachricht-----
Von: Eric Hill [mailto:Eric.Hill at jmp.com]
Gesendet: Dienstag, 19. Mai 2015 22:44
An: General Discussion of SQLite Database
Betreff: Re: [sqlite] Virtual Table query - why isn't SQLite using my indexes?
Hey, Gunter,
...
But then what about a query like this:
SELECT * FROM T1
LEFT OUTER JOIN T2 ON ( T2.a = T1.a ) AND ( T2.b = T1.b ) AND (
T2.c = T1.c );
xBestIndex will get called here for T1 with 3 constraints, c, b, and a, in that
order. In this case, though, it seems (to the uninitiated, at least ;-) that
the "best index" would be:
CREATE INDEX T1_all ON T1 (c, b, a);
(or would it?) but the xBestIndex call does not contain any information that
tells me that. To be able to know that, I would have to know independently
what the join conditions are. And I could make that knowledge available to my
xBestIndex implementation. But how much better would that be than an index on
c and partial scans to find the others?
(I tried this exact example, once creating an index on just T1.c and once
creating an index on T1 (c, b, a), and in both cases, my index was not used by
SQLite. So I don't think I understand what SQLite wants.)
Eric,
an Index on the LHS Table of a LEFT OUTER join never helps, because you are
requesting to retrieve all rows of the LHS anyway. SQLite is calling xBestIndex
with constraints on T1 for symmetry purposes only (this may even be considered
a bug). Try again with indexes on T2.
The more xBestIndex knows about a table, the better its answers to SQLite
will be. Unfortunately, xBestIndex has no way of knowing how many joins the
passed constraints are coming from (apart from the obvious giveaway of repeated
fields).
If you know nothing about a table except for the names of the fields and the
number of rows, then you are best off choosing the first constraint only. (rows
= cost = log n)
If you know the cardinality of each field, you should choose the one with the
highest cardinality c. (rows = n/c, cost = rows + log n)
If you at least know which sets of fields are guaranteed to be unique, choose
the ?most fulfilled? set (tie break: least number of fields, highest
cardinality).
Gunter
___________________________________________
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.