I did.  My last post was based off testing it live - it works beautifully.
Lighting quick and sorted without a temp B-TREE:

EXPLAIN QUERY PLAN is now:

SCAN TABLE content1 USING INDEX content1_index (~100000 rows)
EXECUTE LIST SUBQUERY 1
SCAN TABLE main VIRTUAL TABLE INDEX 6: (~0 rows)

Dave


On Thu, Aug 20, 2015 at 2:36 PM, Vladimir Vissoultchev <wqweto at gmail.com>
wrote:

> Actually, doubt it's possible to use `content1_index` for ordering in your
> case once `content` rows are filtered by the IN operator. Most probably the
> index is just ignored here.
>
> Do you get any measurable performance improvement with vs w/o it?
>
> cheers,
> </wqw>
>
> -----Original Message-----
> From: sqlite-users-bounces at mailinglists.sqlite.org
> [mailto:sqlite-users-bounces at mailinglists.sqlite.org] On Behalf Of David
> Waters
> Sent: Thursday, August 20, 2015 8:58 PM
> To: General Discussion of SQLite Database
> Subject: Re: [sqlite] Is it possible to have query planner use FTS Index
> for
> ORDER BY
>
> Thanks Dan and Vladimir.  A combination of the two approaches is required.
> I'll detail it here for future reference:
>
> Using the sub query against the FTS table as suggested:
>
> SELECT * FROM main
> WHERE rowid IN (SELECT rowid FROM main WHERE main MATCH 'data') ORDER BY
> udate
>
> Still causes the USE TEMP B-TREE FOR ORDER BY.  As Dan pointed out, the FTS
> "index" isn't a traditional SQL Index.  However, by using the suggested
> content table to populate the FTS table, I was able to get the desired
> result, with just a few more steps (and disk space) required:
>
> CREATE TABLE IF NOT EXISTS content1 (id INTEGER PRIMARY KEY, udate, msg)
> CREATE VIRTUAL TABLE IF NOT EXISTS main USING
> fts4(content="content1",id,udate,msg)
> CREATE TRIGGER IF NOT EXISTS content_trig1 AFTER INSERT ON content1 BEGIN
> INSERT INTO main(docid,udate,msg) VALUES(new.rowid, new.udate,new.msg); END
> CREATE INDEX IF NOT EXISTS content1_index on content1 (udate)
>
> To query with ORDER BY, I had to also add the "INDEXED BY" to get the Query
> Planner to use the Index, and not a temp B-tree.
>
> SELECT * FROM content1 INDEXED BY content1_index WHERE rowid IN (SELECT
> rowid FROM main WHERE main MATCH 'data to match') ORDER BY odate"
>
> And I now have fast (and sorted) FTS queries again, with no temp B-tree!
>
> Thanks.
>
> Dave
>
>
>
> On Thu, Aug 20, 2015 at 11:23 AM, Vladimir Vissoultchev <wqweto at gmail.com>
> wrote:
>
> > Try to rewrite the query like this
> >
> > SELECT * FROM main
> > WHERE rowid IN (SELECT rowid FROM main WHERE main MATCH 'data') ORDER
> > BY udate
> >
> > cheers,
> > </wqw>
> >
> > -----Original Message-----
> > From: sqlite-users-bounces at mailinglists.sqlite.org
> > [mailto:sqlite-users-bounces at mailinglists.sqlite.org] On Behalf Of
> > David Waters
> > Sent: Thursday, August 20, 2015 4:47 PM
> > To: General Discussion of SQLite Database
> > Subject: Re: [sqlite] Is it possible to have query planner use FTS
> > Index for ORDER BY
> >
> > Sorry.  I should have specified that that 'udate' is one of the
> > indexed columns of the FTS4 table main.
> >
> > The goal is to do a FTS query and be able to ensure the results are
> > ordered the same each time (via the ORDER BY).  It seemed at first to
> > me that the FTS index contains what is needed for the ORDER BY, but
> > that is likely incorrect.
> >
> > Thanks.
> >
> > DW
> >
> > On Thursday, August 20, 2015, Dan Kennedy <danielk1977 at gmail.com> wrote:
> >
> > > On 08/20/2015 12:38 PM, David Waters wrote:
> > >
> > >> I have a large FTS4 table (around 200 million rows and growing).  A
> > >> simple query (SELECT * FROM main WHERE main MATCH 'data') returns
> > >> in less than a second.  However, if an ORDER BY is added (SELECT *
> > >> FROM main WHERE main MATCH 'data' ORDER BY udate) it will never
> > >> return (after 20 mins, I canceled the query).
> > >>
> > >> EXPLAIN QUERY PLAN on the ORDER BY statement shows 'USE TEMP B-TREE
> > >> FOR ORDER BY'.  Shouldn't it attempt to use the available FTS Index
> > >> for ORDER BY?
> > >>
> > >
> > > I don't see how it could. The FTS index is not a list of rows sorted
> > > by udate.
> > >
> > > If not, Is there another method (or work around) to get the data
> > > back
> > >> in order?
> > >>
> > >
> > > You could use an external content FTS index. Then put a regular
> > > index on the udate column of your external content table and query
> > > it directly for non-fulltext queries.
> > >
> > >   https://www.sqlite.org/fts3.html#section_6_2_2
> > >
> > > Dan.
> > >
> > > _______________________________________________
> > > sqlite-users mailing list
> > > sqlite-users at mailinglists.sqlite.org
> > > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> > >
> >
> >
> > --
> > Dave
> > _______________________________________________
> > sqlite-users mailing list
> > sqlite-users at mailinglists.sqlite.org
> > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> >
> > _______________________________________________
> > sqlite-users mailing list
> > sqlite-users at mailinglists.sqlite.org
> > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
> >
>
>
>
> --
> Dave
> _______________________________________________
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>



-- 
Dave

Reply via email to