it could be very nice to have a tool going through a bunch of queries,
giving all the optimal indices...
nothing to do with a brain, it is something that can be produced
automatically.
the final decision on to create them or not is belong to the implementer
(the brain)

I know that I would be happy to have such a tool, but if no one have the
need, then I will stay with my brain ...

Thank you very much for your help & answer,

Best regards,
Sylvain

On Tue, Nov 3, 2009 at 9:16 PM, Simon Slavin <slav...@bigfraud.org> wrote:

>
> On 3 Nov 2009, at 7:33pm, Sylvain Pointeau wrote:
>
> > I just think that it could be useful to know if an index is optimal
> > or not,
> > kind of a tool that could give you the best index for speed up a
> > query.
>
> Your brain.  A simplified explanation on how to decide what indices
> you need follows.
>
> Each SELECT command uses exactly one INDEX.  For the SELECT to work
> fastest you make sure there's an index which is an ideal helper for
> the SELECT command.  A normal SELECT command (one without special
> things like JOIN and 'group') uses an index for three things:
>
> SELECT rcol1, rcol2, rcol3 FROM table1
>     WHERE wcol1<88 AND wcol2>'DEF' and wcol3=208
>     ORDER BY ocol1, ocol2 DESC, ocol3
>
> 1) To reject all the records your SELECT does not want
> 2) To retrieve the records your SELECT /does/ want to the right order
> 3) To save the effort of having to read the row data from the actual
> TABLE
>
> If you are making up an index especially to suite a particular query
> you start considering your variables from the beginning of the index ...
>
> CREATE INDEX tab1_idx1 ON table1 (col1, col2, col3, col4, col5 ...)
>
> The first columns you'll list will be the ones mentioned in your WHERE
> clause.
> The next columns you'll list will be the ones used in your ORDER BY
> clause, in the order that that clause mentions them.
> You might also list other columns which have values you want to
> return, but there is a payoff in that between database size, the speed
> your SELECT runs at, and the speed your INSERT and UPDATE commands run
> at.
>
> So without knowing anything about the table, or the values in it, for
> the above SELECT I might guess that the best index would be
>
> CREATE INDEX tab1_idx1 ON table1 (wcol1, wcol2, wcol3, ocol1, ocol2,
> ocol3, rcol1, rcol2, rcol3)
>
> but that's purely a guess.  The ocols may be in a poor order.  There
> may be no point in listing the rcols.  In fact there may be no point
> in listing the ocols either.
>
> It's worth noting that although the index is very important in making
> the SELECT command run quickly, careful arrangement of a WHERE clause
> can also make a big difference when the WHERE clause is complicated.
> However, guessing the best arrangement for the WHERE clause cannot be
> done without knowledge of example data in the table: it depends on
> whether the data is clumped in only a few distinct values, or spread
> evenly over a lot of different values.
>
> You can read more about this, although it's not easy to understand
> without experience, here:
>
> <http://www.sqlite.org/optoverview.html>
>
> Simon.
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to