On additional thing.

One of the indices will not be required. Since one table will be the driving 
table and will require a full scan. The other table should have the index. I 
would make that the smaller of the tables.

Secondly if at all possible try not to make composit fields. A compoisit field 
is one where you have one field but put two or more data elements in it. For 
example a "name" that you use to store first and last names vs creating two 
columns first_name last_name.



--- On Sat, 9/12/09, RB Smissaert <bartsmissa...@blueyonder.co.uk> wrote:

> From: RB Smissaert <bartsmissa...@blueyonder.co.uk>
> Subject: Re: [sqlite] Any way to speed up this SQL?
> To: "'General Discussion of SQLite Database'" <sqlite-users@sqlite.org>
> Date: Saturday, September 12, 2009, 6:47 AM
> Thanks for the tip and will have a
> look at that.
> I have in the meantime made this a lot faster by making the
> data in both
> tables upper case and making the small table smaller by
> taking out invalid
> records. I can then run a simpler join with glob, although
> I noticed it
> still doesn't use the index. Sounds like your solution will
> be faster still.
> 
> RBS
> 
> 
> -----Original Message-----
> From: sqlite-users-boun...@sqlite.org
> [mailto:sqlite-users-boun...@sqlite.org]
> On Behalf Of marbex
> Sent: 12 September 2009 12:25
> To: sqlite-users@sqlite.org
> Subject: Re: [sqlite] Any way to speed up this SQL?
> 
> 
> I had a similar issue. I wanted to find strings that
> started as another
> string in the same table and field. My solution was to
> create a temp table
> that consisted of the id, the string and the first word of
> the string which
> I then indexed. The table had 30 000 records and the total
> processing time
> went down from 15-20 minutes to 15 seconds!
> 
> Applying that solution to your case, not knowing the nature
> of your data (I
> had names), I guess you can do something like this:
> 
> - Get the length of the shortest string in table2.term.
> Lets say it's 3.
> 
> - Create a tmptable of table1
> Create temp tmptable1 as
> select term, lower(substr(term,1,3)) shortest
> from table1
> 
> - Create a tmptable of table2
> Create temp tmptable2 as
> select term, lower(substr(term,1,3)) shortest
> from table2
> 
> - Index the shortest fields
> Create index idx_tmptable1_shortest on tmptable1(shortest)
> Create index idx_tmptable2_shortest on tmptable2(shortest)
> 
> -Run this sql
> select
> count(a.rowid)
> from tmptable1 a inner join tmptable2 b on
> a.shortest=b.shortest
> where (lower(b.term) =
> lower(substr(a.term,1,length(b.term))))
> 
> 
> 
> RB Smissaert wrote:
> > 
> > Have 2 tables with both one text field called term and
> need to run a SQL
> > like this, to count the records in table1 where the
> start of term in
> > table1
> > equals a term in table2:
> > 
> > select
> > count(a.rowid)
> > from table1 a inner join table2 b on
> > (lower(b.term) =
> lower(substr(a.term,1,length(b.term))))
> > 
> > term is indexed in both tables, but not surprisingly,
> this query runs very
> > slow, taking some 40 minutes. Table1 is large, maybe
> some 1 million rows
> > and
> > table2 is small, maybe some 30.000 rows. All rows in
> table2 are unique,
> > but
> > table1 has many duplicates.
> > 
> > Any suggestions to speed this up?
> > I could also tackle this in code rather than in SQL.
> > 
> > RBS
> > 
> > 
> > 
> > 
> > _______________________________________________
> > sqlite-users mailing list
> > sqlite-users@sqlite.org
> > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
> > 
> > 
> 
> -- 
> View this message in context:
> http://www.nabble.com/Any-way-to-speed-up-this-SQL--tp25412299p25413614.html
> Sent from the SQLite mailing list archive at Nabble.com.
> 
> _______________________________________________
> 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
> 
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to