Thanks for that Is it possible to do an index on a substring of a field eg: subtr(start,10) to get just the day
On 17/01/2009, Igor Tandetnik <[email protected]> wrote: > "Mike Martin" <[email protected]> wrote > in message > news:[email protected] >> The following query runs in around 10 secs with no indexes, however if >> I index the start field (datetime) it takes around 10 minutes + >> Select guide.id,channels.Channel,start,start,name,stop,stop,cat0 from >> guide join channels on pnr=ind left join blacklist on >> blacklist.channel =channels.Channel where (start >= >> datetime('2009-01-16 02:05:42','-1 hours') or (start < '2009-01-16 >> 02:05:42' and stop > '2009-01-16 02:05:42')) and blacklist.channel >> is null and start <'2009-01-17 02:05' order by >> start,upper(channels.channel) ; > > The only clause that the index on start applies to is [start > <'2009-01-17 02:05'] (an index cannot be used for an OR condition). I > suspect this condition in your case holds for a substantial number of > records in guide. > > An index only helps when it can be used to select a small number of > records (a rule of thumb I've seen is 10% or less of the total number in > the table). Once it selects too many, it actually hurts performance. You > see, a linear scan without the index works in O(N) time (where N is the > number of records in the table). A scan using the index works in O(m * > log^2(N)) (where m is the number of records satisfying the condition). > This only favors the index when m is much smaller than N. The problem > is, SQL engine can't know up front how many records will satisfy the > condition, and whether the index will be beneficial. If you give it an > index, it will use it; if it's a poorly chosen index, the performance > will actually suffer rather than improve. > > In your case, perhaps you could make a reasonable assumption that no > program would run for longer than, say, 48 hours, and replace [start > <'2009-01-17 02:05'] with [start between '2009-01-15 02:05' and > '2009-01-17 02:05'] (choose tighter bounds if possible). Hopefully, only > a small portion of records falls in this range. > > Further, to improve the speed of joins, consider an index on > channels.ind and blacklist.channel > > Igor Tandetnik > > > > _______________________________________________ > sqlite-users mailing list > [email protected] > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > _______________________________________________ sqlite-users mailing list [email protected] http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

